長時間実行されるプロセスと通信するための標準的な Linux/Unix パターンはありますか?
たとえば、C ++で記述され、さまざまなマシンで実行されている数百のプロセスがあり、シェルスクリプトを介して構成のリロード、開始、停止などのコマンドを送信したいと考えています。
長時間実行されるプロセスと通信するための標準的な Linux/Unix パターンはありますか?
たとえば、C ++で記述され、さまざまなマシンで実行されている数百のプロセスがあり、シェルスクリプトを介して構成のリロード、開始、停止などのコマンドを送信したいと考えています。
説明したように、開始/停止/リロード構成などの単純なアクションをトリガーしようとしている場合、最も一般的な方法は、シグナルを使用することです。
シェルスクリプトからコマンドを使用してkill
、特定のシグナルを特定のプロセスに送信できます。プロセス内で、1 つ以上のシグナル ハンドラーを実装します。signal()
シグナル ハンドラーは、関数または関数を使用して 1 つ以上のシグナルを受信するように登録されsigaction()
ます。
通常SIGHUP
、構成のリロードをトリガーするために使用されます。SIGSTOP
一時停止とSIGCONT
再開に適している場合があります。
man 7 signal
選択可能なシグナルの完全なリストが表示されます。
より複雑なアクションをトリガーする必要がある場合は、名前付きパイプを作成できます。プロセスでパイプを作成し、シェル スクリプトからecho
コマンドを実行します。
リモート プロセスにも関心があるため、すべてのプログラムのソース コードを変更できると仮定すると、リモート プロセスと通信する方法を検討できます。
独自の小さなテキスト プロトコルを定義し、各プロセスにソケットまたは名前付きパイプをリッスンさせます。おそらくpollのような多重化システムコールが必要になるでしょう
MPI、Corba、またはおそらくD-BusやONC/RPC/XDRなどの既存のライブラリとツールを使用する
アプリケーションの構成ファイルを変更し、シグナル規則を設定します。たとえば、catchSIGHUP
を使用して構成をリロードし、SIGTERM
適切に終了します (ただし、シグナルをリモートで送信する方法はありません。たとえば、ssh
何らかのkill
コマンドが必要になります)。