2016-11-16 11 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を表します)に等しいです。これは、プロセスがハードCPUの限界に達し、カーネルによって強制終了されたときに起こりそうです。

subprocess.call()呼び出されたプロセスがゼロ以外の終了ステータスで返された場合、例外は発生しません。そのような振る舞いが必要な場合は、subprocess.check_call()またはsubprocess.run(..., check=True)のいずれかの方が良いでしょう。これにより、0以外の終了ステータスでCalledProcessErrorが発生します。

+1

ありがとうございます。私はupvoteすることはできませんが、私は受け入れた。 –

関連する問題