私は C++ で書いた Linux デーモンを持っています。これは、コンソールを介してネットワーク経由でユーザーから「再起動」コマンドが与えられたときに、それ自体を再起動する必要があります。これは可能ですか?スクリプトを使用し/etc/init.d
ます。自動的に再起動するようにプログラムするにはどうすればよいですか? 非常に長い遅延 (1 分) で新しいプロセスを起動し、シェル スクリプトを再度起動する必要がありますか? 問題は、デーモンが終了するまでに非常に長い時間がかかり、最悪のシナリオでは 1 分以上かかることです。
4 に答える
アプリケーションが自動的に再起動するには、基本的に次の 3 つの方法があります。
アプリケーションが再起動するように指示されると、アプリケーションは適切なクリーンアップを実行し、割り当てたすべてのリソースを解放してから、最初から開始したかのように再初期化します。
新しい子プロセスがそれ自体を実行し、親プロセスが正常に終了する新しいプロセスを fork します。
デーモンは、実際には単なるラッパー アプリケーションであり、init-script によく似ています。親プロセスが終了するのを待つ間、実際のアプリケーションを実行する新しいプロセスをフォークします。子プロセス (および実際のアプリケーション) が特別な終了コードを返した場合、それは再起動する必要があることを意味し、forks/exec が最初からやり直されます。
ポイント2と3は基本的に同じであることに注意してください。
必要なシャットダウン/クリーンアップを実行してから、これを呼び出します。
execl( argv[0], argv, reinterpret_cast< char* >( 0 ) );
fork() や exec() と同じですが、フォークをスキップします。exec は、現在のプロセスをそれ自体の新しいコピーに置き換えます。参照。http://linux.die.net/man/3/exec
init スクリプトは、デーモンを強制終了して再起動するだけです。デーモンからデーモンを再起動しようとしないでください。