如何捕获后台进程的输出?

4
什么是在后台运行进程并仅在需要时接收其输出的最佳方法?
预期使用情况:创建具有重型初始化的提示输出脚本,使其每个会话仅初始化一次而不是在每次提示运行时都初始化。注意:需要双向通信:shell 需要告诉何时需要新提示,上一个命令的状态。
已知解决方案:
- 在文件系统上创建一些显式文件(FIFO 文件、UNIX 套接字):最好避免使用此方式,因为这意味着我需要选择文件名,确保它在退出时被垃圾回收,并添加清理不再使用的文件的内容以防发生崩溃。 - zsh/zpty 模块:对于此工作来说有点过于复杂,并且在 bash 中不起作用。 - 协处理器:在 bash 中不起作用,据我所知,每个会话只允许一个协处理器。
1个回答

1
自4.0版本起,Bash支持协程,但多个协程仍处于试验阶段。
如果它们是每个用户和主机的,我会选择一些显式创建的文件,并将它们命名为~/.myThing-$HOSTNAME/fifo。您可以使用flock相对容易地确定命令是否仍在运行,并选择启动它:
(
  flock -n 123 || exit 1
  rm/mkfifo ..
  exec yourServer < .. > ..
) 123> ~/".myThing-$HOSTNAME/lockfile"

如果命令或服务器死亡,锁定将自动释放,只留下一些长度为零的文件。下次服务器启动时,它会删除并重新设置它们。
查询服务器将类似,但如果锁未被使用,则退出(并可选择使用等待锁以避免争用)。

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