2016-08-20 3 views
0

ulimit -t을 사용하여 하나의 python 스크립트의 CPU 사용을 제한하려고합니다. 스크립트에 하나의 time.sleep() 문이 포함되어 있으며 지정된 제한 시간이 지나면 스크립트가 종료되지 않습니다. 여기 test.py라는 이름의 단순화 된 파이썬 스크립트입니다ulimit -t가 time.sleep을 사용하여 제한을 벗어난 프로세스를 죽이지 않는 이유는 무엇입니까?

import time 

while True: 
    time.sleep(0.1) 

와 나는 다음과 같은 명령을 실행 : 스크립트는 영원히 계속 실행

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

제목을 개선하려고 시도했습니다. 원래 두 질문 중 어떤 두 가지 구성 요소가 관련되었는지는 분명하게 나타 났지만 문제의 행동이나 상호 작용 측면은 분명하지 않았습니다. –

답변

3

ulimit -t는 CPU 시간 제한을 설정한다. 프로그램이 잠자는 동안 CPU 시간을 사용하지 않으므로 시간은 계산에 포함되지 않습니다. 다시 잠을 자려면 몇 가지 CPU 사이클 만 차지하므로 죽지는 않습니다.

ulimit을 사용하여 실시간 제한을 지정할 수 없습니다.

+0

실시간 제한을 구현하려면 제한 시간 동안 잠자기 상태 인 스레드를 예약하고 만료되면 프로세스를 종료하십시오. – wallyk

+0

고마워, 그게 내 프로그램의 문제 야. 방금 ulimit -t가 생성 된 각 프로세스에 대해 동일한 값을 적용하고 생성 된 하위 프로세스에 누적 값을 적용하지 않는다는 사실을 발견했습니다. 나는 실제 코드를 업데이트했다. 현재 프로세스와 생성 된 모든 "서브 프로세스"에 걸쳐 누적 시간을 제한하기위한 아이디어가 있습니까? –

+0

아니, 내 머리 꼭대기에서가 아니라. ulimit에 의해 설정된 자원 제한은 항상 프로세스마다 있습니다. 편집 한 질문은 처음 질문과 완전히 다릅니다. 새 질문을 열어보십시오. – mata