2016-08-20 18 views
0

ulimit -tを使用して1つのpythonスクリプトのCPU使用量を制限しようとしています。スクリプトには1つのtime.sleep()ステートメントが含まれており、指定した制限時間が経過すると、そのステートメントは強制終了されません。なぜulimit -tはtime.sleepで限界を超えて眠っているプロセスをkillしないのですか?

import time 

while True: 
    time.sleep(0.1) 

と私は、次のようなコマンドを実行します:ここでtest.pyという名前の簡略化されたPythonスクリプトがある

ulimit -v 400000; ulimit -t 30; python test.py 

スクリプトが永遠に実行し続けます。これについて何か説明がありますか?ありがとう。

マタの答えは正しいです。 ulimit -tは、生成されたサブプロセスの実行時間を数えないという隠れたものを含んだ私の実際のコードを更新しました。

#!/usr/bin/env python 
# Run: python smt.py filename.smt2 timeout 
# timeout is in seconds 

import os 
import subprocess 
import sys 
import stat 
import time 

current_path = os.path.dirname(os.path.realpath(__file__)) 

def remove_tmp (filename, version): 
    try: 
    os.remove(filename + '.' + version + '.tmp') 
    except OSError: 
    pass 

    try: 
    os.remove(os.path.splitext(filename)[0] + '.' + version + '.out') 
    except OSError: 
    pass 

    try: 
    os.remove(os.path.splitext(filename)[0] + '.' + version + '.in') 
    except OSError: 
    pass 

def run_raSAT (filename, bounds, sbox, timeout): 
    startTime = time.time() 

    raSATResult = "unknown" 

    # remove tmps files: 
    remove_tmp(filename, "0.2") 
    remove_tmp(filename, "0.3") 

    proc2 = subprocess.Popen([os.path.join(current_path, "./raSAT-0.2"), filename, bounds, 'sbox=' + str(sbox), 'tout=' + str(timeout-(time.time() - startTime))]) 
    proc3 = subprocess.Popen([os.path.join(current_path, "./raSAT-0.3"), filename, bounds]) 
    while True: 
    if proc2.poll(): 
     # try read output of 0.2 
     try: 
     with open(filename + '.0.2.tmp', 'r') as outfile: 
      raSATResult = outfile.read().rstrip() 
      outfile.close() 
      if raSATResult == "unknown": 
      sbox /= 10 
      remove_tmp(filename, "0.2") 
      proc2 = subprocess.Popen([os.path.join(current_path, "./raSAT-0.2"), filename, bounds, 'sbox=' + str(sbox), 'tout=' + str(timeout-(time.time() - startTime))]) 
     except IOError: 
     pass 

    if proc3.poll():  
     # try read output of 0.3 
     try: 
     with open(filename + '.0.3.tmp', 'r') as outfile: 
      raSATResult = outfile.read().rstrip() 
      outfile.close() 
     except IOError: 
     pass 

    if raSATResult == "sat" or raSATResult == "unsat": 
     if not proc3.poll(): 
     proc3.kill() 
     if not proc2.poll(): 
     proc2.kill() 
     break 

    time.sleep(0.01) 


    return raSATResult, sbox 

def run(filename, initLowerBound, initUpperBound, sbox, timeout): 
    lowerBound = initLowerBound 
    upperBound = initUpperBound 
    raSATResult = "unknown" 
    startTime = time.time() 
    while (raSATResult == 'unknown'): 
    (raSATResult, sbox) = run_raSAT(filename, 'lb=' + str(lowerBound) + ' ' + str(upperBound), sbox, timeout - (time.time() - startTime)) 
    if raSATResult == 'unsat': 
     (raSATResult, sbox) = run_raSAT(filename, 'lb=-inf inf', sbox, timeout - (time.time() - startTime)) 
    print (raSATResult) 

    # remove tmps files: 
    remove_tmp(filename, "0.2") 
    remove_tmp(filename, "0.3") 

# get timeout from environment 
timeout = float(os.environ.get('STAREXEC_CPU_LIMIT')) 

run(sys.argv[1], -10, 10, 0.1, timeout) 
+0

私はタイトルを改善しようとしました:オリジナルでは、どの2つのコンポーネントが関係していたのかが明らかになりました。 –

答えて

3

ulimit -tCPU時間制限を設定します。プログラムがスリープしている間は、CPU時間を使用しないため、時間はカウントされません。もう一度スリープ状態に入るのはCPUのサイクルを少ししか占有しないため、殺されません。

ulimitを使用してリアルタイム制限を指定することはできません。

+0

リアルタイム制限を実装するには、タイムアウトのためにスリープするスレッドをスケジュールし、プロセスが終了するとプロセスを終了します。 – wallyk

+0

ありがとう、それは私のプログラムの問題です。私は、ulimit -tが、生成された各プロセスに同じ値を適用し、生成されたサブプロセス全体では累積しないことを発見しました。私は実際のコードを更新しました。現在のプロセスと生成されたすべての「サブプロセス」の累積時間を除外するアイデアはありますか? –

+0

いいえ、私の頭の上からではありません。 ulimitによって設定されるリソース制限は、常にプロセスごとです。あなたの編集した質問はあなたの最初のものとは全く異なります。新しい質問を開くことができます。 – mata

関連する問題