追踪锁定资源的 TTY 会话的最佳方式?

追踪锁定资源的 TTY 会话的最佳方式?

假设您有大量交互式 shell 在同一用户 ID 下运行,例如许多screentmux(或两者)“选项卡”。您尝试unmount“ing”一个设备,但发现不能这样做,因为其中一个 shell 会话的当前目录已更改。您可以轻松找到 TTY 名称和与(只是另一个bashzsh)关联的进程列表,但假设您不想要kill它,直到您确定这样做是安全的,您将如何找到相应的screen/ tmux“选项卡” ?

答案1

不确定这是否是最佳方式,但这是“一种”方式。

首先,确定设备打开的是哪个“screen”或“tmux”会话:

lsof -R $mountpoint

从这个输出中您需要的一些信息是进程的 PID 及其 PPID(假设您将它们分别分配给$PID$PPID)。

接下来,检查在此 PID 下正在运行哪些子进程,这应该可以帮助您防止您ssh从此 shell 进入另一台计算机,或者您当前正在运行编辑器或其他程序。如果某些东西正在运行,您应该很容易根据子命令找到所需的选项卡。

pstree -p $PID

假设上述命令没有产生输出,您现在应该检查该 shell 的父级是什么。

ps -f $PPID

如果这不是SCREEN或,tmux你应该能够很容易地弄清楚。

如果是,SCREEN并且您有多个进程,您应该能够通过查看SCREEN所需的子进程来确定是哪一个。

pstree -p $PPID

如果仍然存在多个选项卡,您可以在每个选项卡中打开一个新选项卡SCREEN,然后继续重新运行,pstree -p $PPID直到找出是哪个选项卡。之后,您必须检查每个选项卡并以某种方式找出正确的选项卡。在 shell 中,您可以检查 shell 的 PID 是否与$PID有问题的 shell 或其子级之一(如pstree -p $PID上面生成的)的 PI​​D 匹配。

如果是的话tmux,那就没那么容易了,因为所有的 shell 都在一个 tmux 下。但是,您可以做的tmux就是自动将按键信息发送到所有打开的窗格。如果您在那里运行编辑器,这些可能会产生意想不到的结果,但您可能最清楚是否可以这样做。

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

相关内容