抑制stdout Python SIGSTOP

时间:2015-06-17 20:22:48

标签: python signals stdout

我正在尝试创建一个在后台运行但可以轻松暂停的程序。这可以通过启动prog.py的另一个副本并使用暂停标志来完成。我可以通过这种方式成功暂停和取消暂停我的程序。使用sig处理程序,我可以输出到stdout “暂停计划” “恢复计划”

我启动程序来执行以下命令:

./prog.py -H foo -P bar -i 10

当我以

运行程序时
./prog.py --pause 1

这会引发一个调用

的标志
os.kill(%pid, signal.SIGSTOP)
一切都暂停,但第一次(只有第一次)我暂停它我得到这种类型的输出到stdout:

 [2]+  Stopped                 ./prog.py -H foo -P bar -i 10

我试图通过设置sys.stdout ='/ dev / null'来抑制它,但似乎没有这样做。如果我无法弄明白,这不是世界末日,我只是有点恼火,真的只想在父程序中看到暂停和恢复。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

打印该行不是python。

暂停工作时,您的shell(可能是bash)会打印该行。

所以你无法在python中压制。

坏消息是你无法抑制从bash打印这些信息。请参阅How to suppress Terminated message after killing in bash?

的答案

答案 1 :(得分:0)

如其他答案中所述,这是由您的shell打印的。 shell监视它分叉的每个子进程的状态。其中一个子进程是你的python程序。当它停止时,会通知shell(使用SIGCHLD),获取已停止的子项的终止状态,并打印该消息以通知您其中一个正在运行的作业现在已暂停。

我不知道是否可以配置bash来停止打印作业状态更改,但还有其他一些事情可以做:内部prog.py,只有{{1并退出父级,让孩子活着。这会导致fork()成为prog.py的孩子(而不是init的孩子),因此bash将不再关心它。

我不了解Python,但这是C中的一个例子:

bash

我确定你可以在Python中做类似的事情。