添加信号处理程序,例如
#!/usr/bin/python
import subprocess as sp
import signal
import time
def child_handler(sig, frame):
print("SIGINT child received")
def handler(sig, frame):
print("SIGINT received")
def preexec():
print("entering preexec")
signal.signal(signal.SIGINT, child_handler)
#signal.signal(signal.SIGINT, signal.SIG_IGN)
print("leaving preexec")
def signal_sending():
signal.signal(signal.SIGINT, handler)
p = sp.check_call(["bash", "process.sh"], preexec_fn=preexec)
if __name__ == "__main__":
signal_sending()
process.sh
#!/bin/sh
i=0
while [ 1 ]; do
sleep 0.1;
echo $i
i=$((i + 1))
done
无法正常工作,因为 Ctrl C 会中断子流程(仅打印SIGINT received
),但SIGINT received
和{应该打印{1}}并且孩子继续跑。
添加SIGINT child received
会使孩子不受影响,但这还不够,因为我需要为孩子编写自定义处理程序。
我不在乎是否必须使用python 2.7或3.x来实现这一目标。我使用的是Linux 4.3。
答案 0 :(得分:1)
bash
进程替换了分叉的python
进程,因此无法运行Python回调。 SIG_IGN
适用于SIGINT
,因为它可以在exec()
电话中幸存下来。
如果您希望在按下 Ctrl + C 时运行某些Python代码;把它放在handler()
(父母的信号处理程序)中。或者在bash中捕获相应的信号并对process.sh
中的信号运行python子进程。