【问题标题】:Suppress stdout Python SIGSTOP抑制标准输出 Python SIGSTOP
【发布时间】:2015-06-17 20:22:47
【问题描述】:

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

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

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

当我运行程序时

./prog.py --pause 1

这会引发一个调用的标志

os.kill(%pid, signal.SIGSTOP)

一切都按原样暂停,但第一次(也是第一次)我暂停它,我将这种类型的输出输出到标准输出:

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

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

【问题讨论】:

    标签: python signals stdout


    【解决方案1】:

    打印那行不是python。

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

    所以你不能从 python 内部压制。

    坏消息是您也不能禁止从 bash 打印该信息。见How to suppress Terminated message after killing in bash?的回答

    【讨论】:

      【解决方案2】:

      正如其他答案中提到的,这是由您的外壳打印的。 shell 监视它派生的每个子进程的状态。这些子进程之一是您的 python 程序。当它停止时,shell 会收到通知(SIGCHLD),获取停止的子进程的终止状态,并打印该消息,让您知道其中一个正在运行的作业现在已暂停。

      我不知道是否可以将 bash 配置为停止打印作业状态更改,但您还可以执行其他操作:在 prog.py 中,只需 fork() 并退出父进程,让子进程存活。这会导致prog.py 成为init 的子代(而不是bash 的子代),因此bash 将不再关心它。

      我不懂 Python,但这里有一个 C 语言示例:

      #include <unistd.h>
      #include <string.h>
      #include <stdlib.h>
      #include <stdio.h>
      
      int main(void) {
          pid_t f;
          if ((f = fork()) < 0) {
              perror("Unable to fork");
              exit(EXIT_FAILURE);
          }
          if (f == 0) {
              /* Child takes over */
              while (1); /* Just place your code here */
          }
          return 0;
      }
      

      我相信你可以在 Python 中做类似的事情。

      【讨论】: