while
tmuxステータスバーに無限ループbashスクリプトが含まれています。 ~/.tmux/conf から:
set -g status-right '... #(path/loop.sh) ...'
sh -c
Tmuxが起動したら、次を使用しているようです。
$ 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-session
sh -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セッションが終了した後、サブシェルが自動的に終了したいと思います。SIGTERM
tmux設定を変更したり、プロセスに転送を処理してこれを行う方法はありますか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_がここにあります」実際、これはtmux
Linuxシェル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
。ps
cmd以前のようにバックスラッシュを追加して純粋な形式を使用する方法に注意してください\ps
。これは修正されたバージョンのcmdですawk
。\ps -eF
\ps -e
$4
$11
HTH。