[英]Python: subprocess distinguish between killed and terminated process
我有一个 python 程序,它使用subprocess.run
调用另一个 python 程序,被调用的 python 程序轮流使用subprocess.run
调用一个可执行文件。
按照一个简单的例子
一个.py
#!/usr/bin/env python3
import subprocess
res = subprocess.run(['./b.py'])
retcode = res.returncode
if retcode > 0:
print(f'a.py: Errored, retcode: {retcode}')
elif retcode < 0:
print(f'a.py: Killed, retcode: {retcode}')
else:
print(f'a.py: Completed, retcode: {retcode}')
b.py
#!/usr/bin/env python3
import subprocess
import sys
res = subprocess.run(['./c.sh'])
retcode = res.returncode
print(f"b.py: process exited with {retcode}")
sys.exit(retcode)
c.sh
#!/bin/bash
sleep 300
如果我运行a.py
然后kill -9 <c.sh pid>
我收到以下 output
$ ./a.py
b.py: process exited with -9
a.py: Errored, retcode: 247
我想要实现的是能够从a.py
中得知c.sh
脚本已被杀死,也就是说,我期望以下 output:
$ ./a.py
b.py: process exited with -9
a.py: Killed, retcode: -9
据我了解,问题出在sys.exit(retcode)
指令中,其中执行了-9%256
之类的操作,因此我无法判断c.sh
是否被杀死或出错。
如何检测差异?
谢谢
从sys.exit的文档中:
可选参数 arg 可以是 integer 给出退出状态(默认为零),或其他类型的 object。 如果是 integer,则零被认为是“成功终止”,任何非零值都被 shell 等视为“异常终止”。 大多数系统要求它在 0-127 范围内,否则会产生未定义的结果。 一些系统有为特定退出代码分配特定含义的约定,但这些通常不发达; Unix 程序通常使用 2 表示命令行语法错误,使用 1 表示所有其他类型的错误。
您不能只将-9
代码传递给sys.exit()
。 您可以做的是在模块b.py
中创建一个 function 并从a.py
调用它。 然后脚本a.py
可以检查b
的返回数并打印相应的消息。 a.py
应该只检查子进程b
的retcode
以检查b
是否终止而没有错误。
https://tldp.org/LDP/abs/html/exitcodes.html信号有特殊含义,大于128,小于等于255,可以通过这个信息来检测差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.