【发布时间】:2021-08-21 17:07:15
【问题描述】:
给定以下 Python 脚本:
a.py:
#!/usr/bin/env python3
# a.py
import signal
import subprocess
import os
def main():
print('Starting process {}'.format(os.getpid()))
subprocess.check_call('./b.py')
if __name__ == '__main__':
main()
b.py:
#!/usr/bin/env python3
# b.py
import signal
import time
import os
def cleanup(signum, frame):
print('Cleaning up...')
raise RuntimeError("Error")
def main():
print('Starting process {}'.format(os.getpid()))
signal.signal(signal.SIGINT, cleanup)
signal.signal(signal.SIGTERM, cleanup)
while True:
print('Hello')
time.sleep(1)
if __name__ == '__main__':
main()
如果我执行a.py,然后我通过kill -15 <pid_of_a_py> 杀死它,它会杀死a.py,但b.py 继续运行:
$ ./a.py
Starting process 119429
Starting process 119430
Hello
Hello
Hello
Hello
Hello
Terminated // On a separate terminal, I ran "kill -15 119429"
$ Hello
Hello
Hello
Hello
这是为什么呢?如何确保SIGTERM 从a.py 传播到b.py?还要考虑一个更深的链 a.py -> b.py -> c.py -> d.py ... 我只想为最里面的脚本显式设置错误处理和清理。
【问题讨论】:
标签: python subprocess sigterm