管道关闭后,哪个信号发送到进程

时间:2016-06-29 07:59:52

标签: php linux signals

我运行foreignprogram并将输出传递给outputcatcher。命令执行如下:

$ foreignprogram | outputcatcher

我想处理foreignprogramoutputcatcher的退出。退出foreignprogram后,outputcatcher也会退出。是否有outputcatcher收到的信号,我可以处理它?我尝试了SIGINT,SIGTERM和SIGHUP,但到目前为止还没有运气。

ouputcatcher是用PHP编写的,如果重要,我用pcntl_signal()来处理信号

2 个答案:

答案 0 :(得分:0)

我认为这两个程序是两个独立的程序。

foreignprogram无法知道谁将输出作为输入。除非你巧妙地实施。

但如果你知道foreignprogram pid,那么

您可以做的一件事是,foreignprogram,如果outputcatcher正在运行,您可以检查每一秒。如果没有运行,那么您可以退出outputcatcher

尝试每秒从0发送信号编号outputcatcher并检查返回值。

我不确定如何在PHP中执行此操作。但我认为同样的事情将在bash中完成。

kill -s 0 foreignpgram_pid

这将检查foreignpgram_pid是否正在运行。

答案 1 :(得分:0)

我想出了这个解决方法:

$ foreignprogram | outputcatcher && exitcatcher

exitcatcher退出时,outputcatcher会被执行,这意味着已退出foreignprogram。不是一个优雅的解决方案,但有效。我不接受这个答案,仍在等待我要求的真实答案:)

在现实生活中,我想启动进程,解析其STDERR并将其发布到RabbitMQ。 outputcatcherexitcatcher是相同的脚本,它接受第一个参数作为命令,第二个作为被监视进程的标识。像这样:

$ foreignprogram 2>&1 > /dev/null | catcher output 'foreignProgram' && catcher exit 'foreignProgram'