3

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

预期用途:使具有大量初始化的提示输出脚本在每个会话中初始化一次,而不是在每次提示运行时初始化。注意:需要双向通信:shell 需要告诉何时需要新的提示,最后的命令状态是什么。

已知解决方案:

  • 一些在文件系统上显式创建的文件(FIFO 文件、UNIX 套接字):最好避免这种情况,因为这意味着我需要选择文件名,确保在退出时对其进行垃圾收集并添加一些内容以清理不再使用的文件崩溃的情况。
  • zsh/zpty 模块:这个工作有点矫枉过正,在 bash 中不起作用。
  • 协进程:在 bash 和 AFAIK 中不起作用,每个会话只允许一个协进程。
4

1 回答 1

1

Bash 从 4.0 开始支持协进程,但多个协进程仍处于试验阶段。

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

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

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

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

于 2013-01-22T21:41:47.233 回答