【问题标题】:Kill Cat After Background Process Ends后台进程结束后杀死猫
【发布时间】:2012-06-09 21:37:58
【问题描述】:

在 Cent OS 下使用 mono 运行 C# 程序。有一个FIFO允许外部输入进入这个程序。

我还有cat 来接受来自单声道程序正在运行的屏幕会话的输入。

#! /bin/bash -
echo "Starting server"
mono --gc=sgen Server-CLI.exe < $fifo &
echo $$ > $PIDFILE
cat > $fifo
echo "Server stopped. Cleaning up"
rm -f $fifo
rm -f $PIDFILE

当单声道程序退出时,如何让cat 退出?现在,如果单声道程序退出,cat 仍在运行,因此脚本永远不会到达第二个echo

【问题讨论】:

  • 将此标记为虐待动物。
  • 哎呀!连这个标题都认不出来了……
  • 不,没关系,我们程序员有我们的小特点,每个人都知道。
  • 好吧,至少你的用户名不是“好奇”。

标签: bash cat


【解决方案1】:

保存mono的PID。在后台运行cat 并保存其PID。 waitmono 的 PID。当满足这一点时,killcat 的 PID。

mono &
monoPID=$!
cat &
catPID=$!
wait "$monoPID"
kill "$catPID"

【讨论】:

  • 这行得通!但是,一个副作用是屏幕会话会反复使用“>”发送垃圾邮件(使输出不可见)。我猜这是在后台运行cat 的一些副作用。关于如何阻止这种情况的任何线索?感谢您回答我最初的问题!
  • @Dequ:你是在做cat &gt; "$fifo",而不是我的懒惰占位符版本。我应该完全拼出命令。你不应该在输出中得到“>”。
  • 是的,我正在使用cat &gt; "$fifo"。我现在认为它是由后台运行cat 导致的Server-CLI.exe 程序引起的。无论出于何种原因,Server-CLI.exe 在底部都有一个“>”,表示输入的位置。不要再介意这个问题了,因为似乎只有更改 Server-CLI.exe 代码才能解决它。感谢您确认我不应该因为cat 而得到“>”,这让我回过头来找到我忽略的东西。
【解决方案2】:

你可以从 $ 获得它!

(cat > $fifo)& 
pid=$!

kill -9 "$pid"

【讨论】:

    【解决方案3】:

    catmono 退出时不会立即死亡,因为它正在等待它的stdin。一旦它有一些数据要发送,它就会以SIGPIPE 信号终止,因为管道不再有连接到另一端的进程。

    不幸的是,我不是一个坚定的 select 大师,所以我不知道是否有可能编写一个“更好”版本的 cat 来检查 stdinstdout 并尽快死去stdout的另一端已关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多