如何捕获后台进程的输出

时间:2013-01-22 18:30:04

标签: bash shell ipc zsh

在后台运行流程并仅在需要时接收其输出的最佳方法是什么?

预期用法:对每个会话初始化一次重新初始化的提示输出脚本,而不是每次提示运行。注意:需要双向通信:shell需要告知何时需要新提示,最后一个命令状态是什么。

已知解决方案:

  • 文件系统上的一些显式创建的文件(FIFO文件,UNIX套接字):最好避免这种情况,因为这意味着我需要选择文件名,确保它在退出时被垃圾收集并添加了一些不再清理的东西在发生崩溃时使用过的文件。
  • zsh / zpty模块:对于这项工作来说有点像矫枉过正,并且在bash中不起作用。
  • coprocesses:在bash和AFAIK中不起作用,每个会话只允许一个协处理。

1 个答案:

答案 0 :(得分:1)

Bash支持自4.0版以来的协同处理,但多个协同处理仍然是实验性的。

我会使用一些明确创建的文件,如果它们是每个用户和主机,则命名为~/.myThing-$HOSTNAME/fifo。您可以使用flock来相对轻松地确定命令是否仍在运行,并可选择启动它:

(
  flock -n 123 || exit 1
  rm/mkfifo ..
  exec yourServer < .. > ..
) 123> ~/".myThing-$HOSTNAME/lockfile"

如果命令或服务器死机,则会自动释放锁定,并且您只有几个零长度文件。下次服务器启动时,它会删除并重新设置它们。

查询服务器将类似,但如果锁定正在使用(并且可选地使用等待锁以避免争用),则退出。