假设您有大量交互式 shell 在同一用户 ID 下运行,例如许多screen
或tmux
(或两者)“选项卡”。您尝试unmount
“ing”一个设备,但发现不能这样做,因为其中一个 shell 会话的当前目录已更改。您可以轻松找到 TTY 名称和与(只是另一个bash
或zsh
)关联的进程列表,但假设您不想要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
上面生成的)的 PID 匹配。
如果是的话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