禁止stdout Python SIGSTOP

2024-10-05 22:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个程序,运行在后台,但可以很容易地暂停一个未暂停。这可以通过启动另一个副本来完成进度计划并使用暂停标志。我可以用这种方法成功地暂停和取消暂停我的程序。使用sig处理程序我可以输出到stdout “暂停程序” “恢复程序”

我启动程序,使用如下命令进行工作:

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

当我以

^{pr2}$

这将引发一个标志,该标志调用

os.kill(%pid, signal.SIGSTOP)

所有的事情都会像它应该的那样暂停,但是第一次(而且只有第一次)我暂停它,我会将这种类型的输出输出到stdout:

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

我试图通过设置系统标准输出='/dev/null',但似乎不是这样。如果我搞不清楚这不是世界末日,我只是有点恼火,真的只想在父程序中看到暂停和恢复。有什么想法吗?在


Tags: 方法py命令程序处理程序foo标志stdout
2条回答

打印这行不是python。在

当您挂起一个作业时,这一行由shell(bash)打印出来。在

所以不能从python内部抑制。在

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

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

我不知道是否可以将bash配置为停止打印作业状态更改,但是您可以做一些其他的事情:在prog.py中,只需fork()并在父级中退出,让子级保持活动状态。这会导致prog.py成为init的子元素(而不是{}的子元素),因此{}将不再关心它。在

我不知道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中执行类似的操作。在

相关问题 更多 >