3

root として実行される C++ で記述された foo などのサービスがあります。通常のスクリプト /etc/init.d/foo start|stop|restart があります。

特定の時点で、foo は自身をリロードする必要があります。通常、アップグレードが完了した後。しかし、次のようなことをしています:

system("/etc/init.d/foo restart")

再起動が foo を強制終了するとすぐに、system() 呼び出しも明らかに強制終了され、再起動スクリプトが最後まで実行されないため、機能しません。

同期子を作成する代わりに、呼び出しプロセスの兄弟として非同期に実行される system() の代わりに使用できる別の呼び出しはありますか?

ありがとう!

4

9 に答える 9

2

実装を検討する

/etc/init.d/foo reload

あなたのデーモンのために(私のDebianボックスのgrepによるかなり標準的な判断)。

これは通常、プロセスに SIGHUP シグナルを送信することによって行われます。デーモンには、これをキャッチして構成をリロードするシグナルハンドラーが必要です。

プロセスがリロードする必要があることを認識している場合は、プロセス自体にシグナルを送ることができます。

新しいライブラリを取得するために本当に再起動する必要がある場合は、exec*()

于 2009-03-09T20:59:19.200 に答える
1

Ori が既に述べたことに加えて、一部の Linux ディストリビューションは今でも initab を使用していますが、Ubuntu やおそらく他のディストリビューションは /etc/event.d に切り替えています。そこにファイルを置き(既存のファイルの1つをコピーして編集します)、「sudo start ssh_tunnel」またはファイルの名前でデーモンを起動します。

その後、再起動が必要な場合は、シグナルで強制終了するだけで、システムが再起動します。または、"exit(0);" を呼び出して、再起動の時期を判断することもできます。または何でも。

于 2009-03-09T18:10:29.980 に答える
0

inittab の man ページを参照してください。

プロセスが停止した場合 (リスポーン)、システムがプロセスを自動的に再起動する方法について説明します。

この設定を正しく行うと、サービスを終了するだけで、システムが自動的に再起動 (リスポーン) を処理します。

于 2009-03-09T18:44:46.263 に答える