継続的に実行する必要のあるソフトウェア(C ++)を開発しました。つまり、基本的には、停止するたびに再起動する必要があります。
cronジョブを使用して、それがまだ生きているかどうかを毎分チェックすることを考えていましたが、これを行うためのよりクリーンな方法または標準的な方法があるかもしれません。
前もって感謝します
Fedora と Ubuntu はupstartを使用します。これには、デーモンが終了した場合に自動的に再起動する機能があります。
これを行う最も簡単な方法は、プログラムを起動するスクリプトを用意し、プログラムが返されたら再起動することだと思います。
#!/bin/sh
while true; do
./Your_program
done
Monitは、あなたがやりたいことやそれ以上のことをすることができます。
cron は、アプリ自体が実行されていることを確認するのに十分なほどスマートである場合のオプションです (これは、アプリの多くのコピーが実行されるのを避けるためです)。これは通常、PID ファイルを介して標準的な方法で行われます。
*nix でこれを行う適切な方法は 2 つあります。
OS インフラストラクチャ (solaris の smf/svc、Ubuntu の upstart など) を使用します。これは、いつでも停止/再起動/有効化/無効化/再構成できる適切な方法です。
/etc/inittab で "respawn" を使用します (起動時に有効化)。
launchtoolは、私がこの目的のために使用したプログラムです。プロセスを監視し、必要に応じて再起動します。また、再起動するまで数秒待つこともできます。これは、アプリを再起動する前に解放する必要があるソケットがある場合に役立ちます。それは私の目的のために非常に役に立ちました。
終了時に再起動する「ウォッチャー」プロセスの子として継続的に実行したいプログラムを作成します。子プロセスがいつ終了するかを知るには、wait/waitpid (または SIGCHILD) を使用できます。私は誰かが書いたコードがこれを行うことを期待しています (それは init(8) が行うこととほぼ同じです)
ただし、プログラムはおそらく何かを行います。アプリケーションが実行されていることを確認するだけでなく、アプリケーションがハングしていないかどうか、意図したサービスを提供しているかどうかを確認したい場合があります。これは、ある種のプローブまたは合成トランザクションを実行して、正しく動作していることを確認することを意味する場合があります。
編集: init でこれを行うことができる場合があります。inittab で「respawn」のタイプを指定してください。マニュアルページから:
respawn
The process will be restarted whenever it terminates (e.g. getty).
アプリケーションが実行されているかどうかを約 10 分ごとにチェックし、実行されていない場合はコンピューターを再起動するスクリプトはどうでしょうか。アプリケーションが実行中の場合は、引き続きチェックします。
これは、フリーウェアのプロセス ビューアー ユーティリティである PrcView を使用したスクリプトです。そして、実行する必要があるサンプル アプリケーションとして notepad.exe を使用しました。
@echo off PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\Notepad PV.EXE notepad.exe >nul if ERRORLEVEL 1 goto Process_NotFound :Process_Found echo Notepad is running goto END :Process_NotFound echo Notepad is not running shutdown / r /t 50 goto END :END
これはそれほど簡単ではありません。「わかっている、自分のプログラムを監視するプログラムを作成するか、そのようなプログラムがすでに標準サービスとして存在するかどうかを確認する」と考えている場合。では、誰かがそのプログラムを殺した場合はどうなるでしょうか。守護神伝説は誰ですか?