2016-11-16 4 views
3

Я запускаю python 3.4.3. У меня есть подпроцесс, который может длиться долго или создавать слишком большие файлы. У меня есть этот код.Python3: код исключения или возврата при превышении предела ресурса?

def setlimits(): 
    if DEBUG: 
     print("Setting resource limit in child (pid {0})".format(os.getpid())) 
    resource.setrlimit(resource.RLIMIT_CPU, (.05, .05)) # CPU time in secs 
    resource.setrlimit(resource.RLIMIT_FSIZE, (1000000, 1000000)) # file size 
    resource.setrlimit(resource.RLIMIT_NOFILE, (20, 20)) # Number open files 

Затем я вызываю подпроцесс (внутри большей процедуры) с помощью этого кода.

 rc = None 
     try: 
      rc = subprocess.call(["potentially long-running command"],shell=True, preexec_fn=setlimits) 
     except Exception as err: 
      print("Exception happened") 
      rc = -1 
     print("rc = {0}".format(str(rc))) 

Когда я кормлю его процессом, который длится долго, он не дает мне исключения. (Я ожидал, что OSError будет основан на документации по ресурсам.) Это дает мне rc = 137.

Любая идея, если это задокументировано? Я, конечно, хотел бы знать, что я рассмотрел все случаи; мне нужна проверка if rc>128?

ответ

3

137 - reserved exit code, указывающий, что процесс был убит - он равен 128 + 9 (где 9 обозначает сигнал 9 или SIGKILL). Это, скорее всего, произошло, когда процесс достиг своего жесткого предела ЦП и был убит ядром.

subprocess.call() не вызывает исключения, если вызываемый процесс возвращается с ненулевым статусом выхода. Если вам нужно это поведение, вам лучше с subprocess.check_call() или subprocess.run(..., check=True), что поднимет CalledProcessError на ненулевое состояние выхода.

+1

спасибо. Я не могу повышать, но я согласился. –