1

我已经整理了一个小的 bash 脚本,它启动然后定期检查我的主程序是否正在运行(控制台应用程序,没有 gui)。我的主要应用程序应该是设备(嵌入式)系统的核心,它需要连续运行。

# Start myProgram
   /path/to/myProgram &

while true
do
   if [  -n "`ps ax | grep -v grep | grep myProgram`" ]
   then
       sleep 5 2>&1 > /dev/null
   else
      /path/to/myProgram &
   fi
done

我的主程序包含一个 c++ select()(带计时器)循环,它监视几个 TCP、UDP 和 Unix 域套接字以及标准输入。

在前台运行时,myProgram 按预期运行。当没有人向它发送数据时,它只是坐在 select() 每 2 秒超时一次,摆弄计时器等,然后再次等待。任何以 ENTER 结尾的键盘活动都会被抓取和处理。控制台输入提出“在控制台收到 N 个字节”消息(现在!)

但是,当我的脚本在后台启动 myProgram 时,我会收到一个恒定的“在控制台收到的”字节流”消息,就好像标准输入正在关闭并重新打开,或者其他一些应用程序正在向我的应用程序发送 ENTER 流。

有人可以解释一下吗?

事实上,如果处于后台的状态导致 stdin 关闭/重新打开 ovr 及以上,那么 myProgram 是否有可能检测到它是后台的并与 stdin 断开连接?我是否也需要断开与 stdout 和 stderr 的连接?猜猜这会让我成为一个守护进程。

最后,看门狗程序是否是跟踪 myProgram 仍在运行的更好方法?看门狗可以重启程序而不是重启整个机器吗?

4

1 回答 1

2

只有前台作业可以将标准输入附加到终端。如果后台作业尝试从终端读取,它们将被挂起。您必须将工作留在前台,或从其他地方重定向标准输入。

于 2012-09-05T12:27:12.727 回答