管道关闭后向进程发送哪个信号?

4
我运行一个外部程序foreignprogram,将其输出导入到outputcatcher。命令执行如下: $ foreignprogram | outputcatcher 我想在outputcatcher中处理foreignprogram的退出。当foreignprogram退出时,outputcatcher也会退出。是否有outputcatcher接收到的信号,以便我可以处理它?我尝试了SIGINT、SIGTERM和SIGHUP,但都没有成功。 outputcatcher是用PHP编写的,如果有影响的话,我使用pcntl_signal()处理信号。

foreignprogram退出时,您是否在outputcatcher中遇到标准输入读取错误? - pmverma
2个回答

0

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

foreignprogram 没有办法知道谁接收了它的输出作为输入,除非你巧妙地实现了它。

但是如果你知道 foreignprogram 的进程 ID,

你可以每秒检查一次 outputcatcher 是否在运行。如果没有运行,则可以退出 outputcatcher

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

我不确定如何在 PHP 中实现这一点。但我认为在 bash 中可以按以下方式完成。

kill -s 0 foreignpgram_pid

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


谢谢您的评论,尽管我正在寻找更多“即时”的方法。此外,我不想去调整PID。 - mkudlacek

0

我想出了这个解决方法:

$ foreignprogram | outputcatcher && exitcatcher

outputcatcher 退出时,exitcatcher 就会被执行,这意味着 foreignprogram 已经退出。虽然不是很优雅的解决方案,但它能够工作。我不会接受这个答案,仍在等待我所要求的真正答案 :)

在实际应用中,我想启动一个进程,解析其 STDERR 并将其发布到 RabbitMQ。 outputcatcherexitcatcher 是同一个脚本,它接受第一个参数作为命令,第二个参数作为所监视进程的标识。类似于这样:

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


使用 2>&1 > /dev/null 命令,您将不会收到任何标准输出或标准错误信息。 - pmverma
尽管参数的顺序不同,我只收到 STDERR 而没有 STDOUT。我已经测试过了,它是有效的。如果我将参数交换为 >/dev/null 2>&1,我将完全收不到任何东西。 - mkudlacek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接