【问题标题】:Which signal is sent to a process after pipe is closed管道关闭后向进程发送哪个信号
【发布时间】:2016-10-31 19:27:44
【问题描述】:

我运行foreignprogram 并将输出通过管道传输到outputcatcher。命令执行如下:

$ foreignprogram | outputcatcher

我想在outputcatcher 中处理foreignprogram 的退出。当foreignprogram 退出时,outputcatcher 也会退出。 outputcatcher 是否收到任何信号以便我处理?我尝试了 SIGINT、SIGTERM 和 SIGHUP,但到目前为止没有运气。

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

【问题讨论】:

  • foreignprogram 退出时,您不会在outputcatcher 中收到标准输入读取错误吗?

标签: php linux signals


【解决方案1】:

我想出了这个解决方法:

$ foreignprogram | outputcatcher && exitcatcher

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

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

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

【讨论】:

  • 使用2>&1 > /dev/null,您将收到任何标准输出或标准错误。
  • 尽管参数顺序不同,但我只收到 STDERR 而不是 STDOUT。我已经对此进行了测试,它有效。如果我将参数交换为>/dev/null 2>&1,我将一无所获
【解决方案2】:

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

foreignprogram 无法知道谁在接收我的输出作为其输入。除非你实现起来很棘手。

但是如果你知道foreignprogram pid 那么,

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

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

我不确定如何在 PHP 中执行此操作。但我认为与bash 中的内容相同。

kill -s 0 foreignpgram_pid

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

【讨论】:

  • 感谢您的评论,尽管我一直在寻找一些更“即时”的方法。我也不想摆弄 PID。
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2016-03-21
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多