起動してメインプログラムが実行されているかどうかを定期的にチェックする小さな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
私のメインプログラムには、いくつかのTCP、UDP、Unixドメインソケットとstdinを監視するc ++ select()(タイマー付き)ループが含まれています。
フォアグラウンドで実行すると、myProgramは期待どおりに実行されます。誰もデータを送信しない場合は、select()に2秒ごとにタイムアウトし、タイマーなどをいじって、再び待機します。ENTERで終わるキーボードアクティビティはすべて取得されて処理されます。コンソール入力は、「コンソールで受信されたNバイト」メッセージを表示します(今のところ!)
ただし、スクリプトがmyProgramをバックグラウンドで起動すると、stdinが閉じて再度開いているか、他のアプリがENTERのストリームをアプリに送信しているかのように、「コンソールで受信した)バイトのメッセージの一定のストリームが表示されます。
誰か説明してもらえますか?
実際、バックグラウンドにある状態が原因でstdinがovrを閉じたり再度開いたりしている場合、myProgramがバックグラウンドになっていることを検出してstdinから切断することは可能ですか?stdoutとstderrからも切断する必要がありますか?それが私をデーモンにするだろうと思います。
そして最後に、ウォッチドッグプログラムは、myProgramがまだ実行されていることを追跡するためのより良い方法でしょうか?ウォッチドッグは、マシン全体を再起動するのではなく、プログラムを再起動できますか?