tmuxステータスバーに含まれる無限ループスクリプトを終了する

tmuxステータスバーに含まれる無限ループスクリプトを終了する

whiletmuxステータスバーに無限ループbashスクリプトが含まれています。 ~/.tmux/conf から:

set -g status-right '... #(path/loop.sh) ...'

sh -cTmuxが起動したら、次を使用しているようです。

$ ps x | grep loop.sh
23433 pts/4    S+     0:00 grep --color=auto loop.sh
31814 ?        S      0:00 sh -c path/loop.sh
31818 ?        S      0:00 /bin/bash path/loop.sh

tmux kill-sessionsh -cプロセスを終了します。straceこれを実行してセッションを終了した場合:

$ strace -p 31814
strace: Process 31814 attached
wait4(-1, 0x7ffeacbfbf9c, 0, NULL)      = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=27643, si_uid=1000} ---
+++ killed by SIGTERM +++

ただし、無限ループのため、サブシェルは変更されません。

$ ps x | grep loop.sh
 2443 pts/4    S+     0:00 grep --color=auto loop.sh
31818 ?        S      0:00 /bin/bash path/loop.sh

質問

tmuxセッションが終了した後、サブシェルが自動的に終了したいと思います。SIGTERMtmux設定を変更したり、プロセスに転送を処理してこれを行う方法はありますかsh -c

編集する:tmuxバージョンは2.8です)

答え1

はい、開始されたサブプロセスはtmux -c "start process here"そのセッションでtmux生き残るようです。私は広範なマニュアルページを詳しく見てきましたが、しばらくコマンドのバックフックをグローバルtmuxに設定することが役に立つことを願っていました。tmuxバックフックの形式は次のとおりです。

 $ tmux set-hook -g after-session-closed your_cmd_here

どこ「あなたのcmd_がここにあります」無限ループを生成する子プロセスを終了するために使用できます。しかし、これは役に立ちません。なぜなら「あなたのcmd_がここにあります」実際、これはtmuxLinuxシェルcmdではなくcmdでなければなりません。

代わりに、スクリプトの無限ループ内に次のような行を追加するのが簡単な方法です /path/loop.sh

 [ "x$(ps -e | grep tmux | grep -v grep)" = "x" ] && break

tmux出力にアクティブなプロセスが表示されない場合は、無限ループから外れる可能性がありますps -ae。逆に、tmux関連するプロセスが表示されると、ループは影響を受けずに続行されます。

実際にtmuxセッションを終了してもシステムにまだアクティブなプロセスがある極端なケースでは、上記のテストのより良いバージョンは次のとおりです。man tmux

 [ $(\ps -e |  awk 'BEGIN {rv=0}; tolower($0) ~/tmux/ {if ($4 == "tmux") {rv=1}; exit} END {print rv}') == "1" ] && break
  • tmux上記は、の出力には\ps -e表示されますが、メインプロセスとして表示されない状況、つまり出力ラインの4番目の位置に表示されず、ps -e実行中のプロセスのパラメータとして表示されるか、オプションで含まれる出力として表示される状況について説明します\ps -e
  • pscmd以前のようにバックスラッシュを追加して純粋な形式を使用する方法に注意してください\ps。これは修正されたバージョンのcmdですawk\ps -eF\ps -e$4$11

HTH。

関連情報