我已经整理了一个小的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域套接字以及stdin。
在前台运行时,myProgram按预期运行。当没有人发送数据时,它只是每隔2秒就在select()中超时,与定时器混合,等等,然后再等待。任何以ENTER结尾的键盘活动都会被抓取并处理。控制台输入会显示“在控制台收到的N个字节”消息(暂时!)
然而,当我的脚本在后台启动myProgram时,我得到一个在控制台收到的“)字节的恒定流”消息,好像stdin正在关闭并重新打开,或者其他一些应用程序正在向我的应用程序发送一个ENTER流。 / p>
有人可以解释一下吗?
事实上,如果处于后台的状态导致stdin关闭/重新打开ovr并结束,myProgram是否可以检测到它是背景并与stdin断开连接?我还需要断开与stdout和stderr的连接吗?猜猜这会让我成为一个守护进程。
而且,最后,看门狗程序会更好地跟踪myProgram是否仍在运行?看门狗可以重新启动程序而不是重新启动整个机器吗?
答案 0 :(得分:2)
只有前台作业可以将标准输入连接到终端。如果后台作业尝试从终端读取,则暂停后台作业。您必须将工作留在前台,或者从其他地方重定向标准输入。