シェルスクリプトにシグナルを送信するプロセスの識別

シェルスクリプトにシグナルを送信するプロセスの識別

SIGUSR1シグナルを受信したときに進行状況を出力するためにこの関数を使用するシェルスクリプトを作成しましたがtrap、シグナルを送信したプロセスのSTDOUTに進行状況を出力するスクリプトを取得する方法がわかりません。したがって、スクリプトが端末エミュレータで実行され、/dev/pts/10端末エミュレータからプロセスに信号を送信すると、出力は私が望むように/dev/pts/11送信されます。ハードコーディングされたシェルリダイレクトを介して特定のSTDOUTに進行メッセージを送信したくありません。/dev/pts/10/dev/pts/11wall

ベストアンサー1

あなたが望むことは不可能です。プロセスは、どのプロセスが自分にシグナルを送信したかを確認できません。複数のプロセスが十分に短い時間内に同じプロセスに同じ信号を送信すると、受信者は1つの信号しか見えません。

どのプロセスがシグナルを送信したかを知っていても、送信者の標準出力に書き込む権限がない可能性があります。

必要なタスクを実行する合理的な方法は、プロセスがUnixソケットでリッスンすることです。ソケットに接続がある場合、進捗情報はソケットに書き込まれます。もう一方の端で目的の場所に印刷するようにしてください。

状態を照会するには、以下を使用できます。socket一部のディストリビューションのユーティリティまたはより強力で複雑なユーティリティsocat

socket -r ./my-program-status              # If the socket is a filesystem domain socket in the current directory
socat UNIX-CLIENT:my-program-status -      # If the socket is a filesystem domain socket in the current directory
socat ABSTRACT-CLIENT:my-program-status -  # If the socket is an abstract domain socket in the current directory

サーバー側の概念証明:

while date | socket -q -s ./status; do echo .; done

別のアプローチは、プログラムが定期的にファイルに状態を書き込むことです。

おすすめ記事