繁体   English   中英

Python:子进程区分被杀死和终止的进程

[英]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应该只检查子进程bretcode以检查b是否终止而没有错误。

https://tldp.org/LDP/abs/html/exitcodes.html信号有特殊含义,大于128,小于等于255,可以通过这个信息来检测差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM