我正在运行python 3.4.3。我有一个可能运行很长时间的子进程,或生成太大的文件。我有这个代码。
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
- 类型检查吗?
答案 0 :(得分:3)
137是reserved exit code,表示该过程被终止 - 它等于128 + 9(其中9代表信号9或SIGKILL)。这很可能发生在进程达到其硬CPU限制并被内核杀死时。
如果被调用进程返回非零退出状态,则 subprocess.call()
不会引发异常。如果您想要这种行为,那么您最好使用subprocess.check_call()
或subprocess.run(..., check=True)
,这会在非零退出状态下提升CalledProcessError
。