リソースをロックするTTYセッションを追跡する最良の方法は何ですか?

リソースをロックするTTYセッションを追跡する最良の方法は何ですか?

screen複数またはtmux(または両方)「タブ」など、同じユーザーIDで実行される複数の対話型シェルがあるとします。デバイスを「ing」しようとしましたunmountが、シェルセッションの1つの現在のディレクトリが変更されたため、そうすることができないことがわかりました。 TTY名と(他のbashまたは)にzsh関連付けられているプロセスのリストを簡単に見つけることができますが、kill安全であると確信するまでこれをしたくないと仮定すると、そのscreen/ tmux「タブをどのように見つけることができますか?」?

答え1

これが最善の方法であるかどうかはわかりませんが、「単一の」方法です。

まず、デバイスがどの「screen」または「tmux」セッションを開いたかを確認します。

lsof -R $mountpoint

この出力で必要な情報は、プロセスのPIDとそのPPIDです($PIDおよびそれぞれに割り当てられていると仮定$PPID)。

次に、このPIDでどのサブプロセスが実行されているかを確認します。これは、このシェルから別のコンピュータに入るのを防ぐのに役立つ場合、またはssh現在エディタまたは他のプログラムを実行している場合に役立ちます。何かが実行されている場合は、サブコマンドに基づいて目的のタブを簡単に見つけることができます。

pstree -p $PID

上記のコマンドが出力を生成しないと仮定すると、このシェルの親が何であるかを確認する必要があります。

ps -f $PPID

そうでなければ、SCREENかなりtmux簡単に見つけることができます。

その場合は、SCREENプロセスが複数あり、SCREEN必要なサブプロセスを調べて、どのプロセスであるかを確認できる必要があります。

pstree -p $PPID

それでも複数のタブがある場合は、各タブで新しいタブを開き、どのタブがあるかを調べるまでSCREEN再度実行します。pstree -p $PPIDその後、各タブを確認し、何とか正しいタブを見つける必要があります。シェルでは、シェルのPIDが$PID問題のあるシェルまたはその子孫(pstree -p $PID上記で作成された)のいずれかのPIDと一致することを確認できます。

その場合、tmuxすべてのシェルが1つのtmuxの下にあるため、簡単ではありません。ただし、できることは、tmux開いているすべてのウィンドウにキーストローク情報を自動的に送信することです。そこでエディタを実行すると予期しない結果が出る可能性がありますが、そうすることができればおそらく最もよくわかります。

for i in $(tmux list-panes -a | awk -F': ' '{print $1}'); do
  tmux send-keys -t $i "[[ \$\$ == $PID ]] && logout" Enter
done

関連情報