【问题标题】:bash script control spawned processesbash 脚本控制生成的进程
【发布时间】:2011-10-07 01:49:08
【问题描述】:

我正在使用这样的脚本在外部控制一个运行时间很长的进程的标准输入和标准输出:

#!/bin/sh
touch process.stdin
tail -fn0 process.stdin | my_process > process.stdout

这工作正常,除非当 my_process 退出时,尾部进程不会退出。当 my_process 退出时,有没有办法让尾巴退出?

或者有没有更好的设置方法?

【问题讨论】:

  • 来自man tail--pid=PID with -f, terminate after process ID, PID dies。如果你知道 pid...?
  • 我怎样才能获得 my_process 的 pid 但仍然能够通过管道传输到它?
  • 不管怎样,我尝试了--pid=$$exec my_process,但没有太大的成功。
  • 你想达到什么目的? my_process 做什么,它是一个脚本吗?这取决于但可能创建一个命名管道可以使其更简单。
  • 您想跟踪正在写入process.stdin的进程的PID。

标签: bash unix process


【解决方案1】:

您实际上在这里制定:继续 (-f) 显示这个不断增长的文件的最后零行 (-n0) 并将其推到 my_process 的喉咙。 尽管 my_process 确实退出了,但似乎 -f 标志阻止了 tail 退出。

要以一种简单的方式很好而肯定地结束事情,您可以尝试在退出时从它的子 my_program 中终止 tail:kill -SIGTERM $PPID

甚至以一种非常简洁的方式:trap "kill -SIGTERM $PPID" EXIT

如果 my_process 不是 bash shell 脚本,试试这个:

tail -f process.stdin | ( my_process > process.stdout ; kill -SIGTERM $PPID )

我认为您正在尝试从日志文件进行管道传输。您也可以将 my_process 的执行连接到 rsyslog 或使用 inotifywait。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2010-10-30
    • 2018-05-03
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多