2

Linux サービスとして実行される C++ プログラムがあります。プログラムのコマンド ライン オプションの一部は、単純に構成ファイルに値を設定してから終了するため、新しい構成を取得するためにサービスを再起動する必要があります。サービスが中断されずに実行を継続できるようにするために、次のように機能します。

  • システムの起動時にバックグラウンド サービスが開始する
    • バックグラウンド サービスは、構成ファイルを監視する「構成ウォッチドッグ」スレッドを作成します
  • ユーザーはコマンドラインから「progname options」を実行します
    • 構成ファイルが変更されました
    • プログラム終了のコマンド ライン インスタンス
    • バックグラウンド サービスの構成ウォッチドッグ スレッドが構成の変更を検出し、再起動をトリガーします

新しい構成を読み取った後にプログラムが再起動するとき、サービスとして引き続き管理できるように、元のインスタンスと同じプロセス空間に残るように execv を呼び出しています。問題は、execv が期待どおりに動作せず、代わりに既存のプロセスを終了し、新しいプロセスで再起動していることです。PID が一致しなくなったため、この時点で「service progname stop/restart」を実行しようとすると、正しく機能せず、「stop」によってサービスが実行されたままになり、「restart」によってプログラムの重複インスタンスが生成されます。 .

execv に渡される argv[0] が実行可能ファイルへのフル パスであることを確認したため、シェル経由で PATH 内の実行可能ファイルを検索するべきではありません (これは、execv を使用しているという事実によっても防止されるはずです)。 execvp の代わりに) 他のアプリケーションで同様の問題を引き起こすことについて読んだことがあります。

4

1 に答える 1

0

問題が見つかりました。問題は、プログラムが起動時にdaemon()を使用し、内部でfork/execを実行し、プログラムを再起動するときにdaemon()を再度呼び出していたことです。起動/再起動を区別し、daemon() の再呼び出しを回避するように拡張した後、問題は修正されました。

于 2012-12-18T22:20:03.313 に答える