正则表达式 – 如何关闭除当前的其他shell?

我需要一个简单的脚本来关闭其他
shell /会话,除了我当前登录的那个.我坚持这一行:

ps -o pid,tty,comm | grep sh$

这导致选择当前的shell.

例如:

 1346 136,0  sh
 1355 136,1  sh

我可以使用tty命令来了解我当前的shell(pts).然后,我想我需要一个循环.

解决了:

ps -o pid,tty,comm | grep sh$| grep -v $$| awk '{print $1}' | xargs kill -9

最佳答案 这实际上并不像最初看起来那么容易.主要的挑战是ps实用程序在不同平台之间相当不兼容,这会产生一个非常大的风险,即您对可能使用脚本的系统所做的关于ps的假设并不总是正确的.而且由于任务是一个相当危险的任务,你需要在这里小心.举个例子,我当前系统上的ps(Cygwin)没有-o选项,而你的系统似乎有一个.

无论如何,这是我的解决方案:

pidCol=$(ps| head -1| awk '{ for (i = 1; i <= NF; ++i) if ($i == "PID") { print(i); exit; }; };');
if [[ -n "$pidCol" ]]; then
    ps| tail -n+2| grep sh$| cut -c2-| awk "{ print(\$$pidCol); };"| grep -v "^$$\$"| xargs kill -9;
fi;

它首先获取ps输出中包含进程PID的列号.我试图通过解析ps标题行使其尽可能健壮.因此,如果PID列位置在系统之间变化,我们仍应正确地为当前系统获取它.

然后,我在kill管道周围应用了一个防护,以确保它只在我们从parse命令成功获得$pidCol时才运行.

然后,在实际的kill管道中,我剥离了头,grep用于所有sh进程,切断了第一个字符(因为某些系统上的ps在一些(但不是全部)行的开头打印了一个小字符指示符在标题行中获取相应的列名称,然后使用awk只打印PID列值.最后,我查看当前进程的PID并通过xargs kill -9运行剩余的PID.

点赞