アプリケーションXがtmuxウィンドウの前景で実行されているとします。 SIGUSR1という特定の信号をアプリケーションXに送信したいと思います。現在選択されているウィンドウのフォアグラウンドプロセス(またはプロセスグループ)にシグナルを送信するようにtmuxキーバインディングを設定できますか?
ベストアンサー1
私のKubuntuは、ps
プロセスが接続されている端末のフォアグラウンドプロセスグループIDを提供します。キーワードはです。で識別されたプロセスtpgid
のクエリを渡すと、このウィンドウでフォアグラウンドプロセスグループIDが取得されます。ps
tmux
#{pane_pid}
次のバインディング(in ~/.tmux.conf
)はprefixkSIGUSR1をフォアグラウンドプロセスグループ(デフォルトprefixはCtrl+ b)に送信します。
bind-key k run-shell 'kill -s USR1 -- "-$(ps -o tpgid:1= -p #{pane_pid})"'
メモ:
前のダッシュ(
-
)は$(…)
前景プロセスを見つけるのに役立ちます。グループ。ダッシュなしで試すことができ、1つのプロセスのみをターゲットにすると、そのプロセスはフォアグラウンドプロセスグループの「リーダー」になります。しかし、「リーダー」が(まだ)存在するという保証はありません。グループをターゲティングするのは合理的なアプローチであり、Ctrl+ cSIGINT をグループに送信するのと似ていますが、メカニズムは異なります。:1
この答えから抜粋:ps
スペースなしでコマンド出力形式を設定します。。前にダッシュを追加するときは、先行スペースを削除することが重要です。競争条件があります。
kill
その後実行され、ps
プロセスグループがまだフォアグラウンドにあるか、まったく存在するという保証はありません。残念ながらprefixk、ターゲットにするプロセスが終了すると問題が発生する可能性があります。誤ってSIGUSR1を他のプロセスに送ることができます。おそらく殻になるでしょう。それから…
SIGUSR1 の基本操作は終了です。。特に、フォアグラウンドにある(つまり、コマンドを待つ)インタラクティブシェルはprefixk.bashで実行できます。事前にトラップを設定してこれを防ぐことができます。
trap '' USR1
シェルはシグナルを無視します。この場合、子プロセスは明示的に信号を処理するように選択しない限り信号を無視しますdd
。trap : USR1
シェルはシグナルを「無視」(何もせずに応答)しますが、これは子プロセスの動作には影響しません。