3

長時間実行されるプロセスと通信するための標準的な Linux/Unix パターンはありますか?

たとえば、C ++で記述され、さまざまなマシンで実行されている数百のプロセスがあり、シェルスクリプトを介して構成のリロード、開始、停止などのコマンドを送信したいと考えています。

4

3 に答える 3

6

信号。

于 2012-04-05T03:06:07.283 に答える
2

説明したように、開始/停止/リロード構成などの単純なアクションをトリガーしようとしている場合、最も一般的な方法は、シグナルを使用することです。

シェルスクリプトからコマンドを使用してkill、特定のシグナルを特定のプロセスに送信できます。プロセス内で、1 つ以上のシグナル ハンドラーを実装します。signal()シグナル ハンドラーは、関数または関数を使用して 1 つ以上のシグナルを受信するように登録されsigaction()ます。

通常SIGHUP、構成のリロードをトリガーするために使用されます。SIGSTOP一時停止とSIGCONT再開に適している場合があります。

man 7 signal選択可能なシグナルの完全なリストが表示されます。


より複雑なアクションをトリガーする必要がある場合は、名前付きパイプを作成できます。プロセスでパイプを作成し、シェル スクリプトからechoコマンドを実行します。

于 2012-04-05T03:35:35.883 に答える
1

リモート プロセスにも関心があるため、すべてのプログラムのソース コードを変更できると仮定すると、リモート プロセスと通信する方法を検討できます。

  • 独自の小さなテキスト プロトコルを定義し、各プロセスにソケットまたは名前付きパイプをリッスンさせます。おそらくpollのような多重化システムコールが必要になるでしょう

  • MPICorba、またはおそらくD-BusONC/RPC/XDRなどの既存のライブラリとツールを使用する

  • アプリケーションの構成ファイルを変更し、シグナル規則を設定します。たとえば、catchSIGHUPを使用して構成をリロードし、SIGTERM適切に終了します (ただし、シグナルをリモートで送信する方法はありません。たとえば、ssh何らかのkillコマンドが必要になります)。

于 2012-04-05T04:53:26.927 に答える