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