Regex 如何关闭除当前外壳外的其他外壳?
我需要一个简单的脚本来关闭除我当前登录的shell/会话之外的其他shell/会话。我被这句话困住了:Regex 如何关闭除当前外壳外的其他外壳?,regex,bash,shell,unix,tty,Regex,Bash,Shell,Unix,Tty,我需要一个简单的脚本来关闭除我当前登录的shell/会话之外的其他shell/会话。我被这句话困住了: ps -o pid,tty,comm | grep sh$ 这将导致选择当前壳 例如: 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
ps -o pid,tty,comm | grep sh$
这将导致选择当前壳
例如:
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
所做的假设在您可能使用脚本的系统上并不总是正确的。既然任务是一个相当。。。危险的人,你在这里要小心。例如,我当前系统(Cygwin)上的ps
没有-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;
pidCol=$(ps | head-1 | awk'{for(i=1;i运行以下命令以获取运行会话的PID
(进程ID):
ps-ft
使用这些PID
s强制终止进程:
kill -TERM <PID1> <PID2> <PID3>
kill-TERM
使用BASH
中的一个循环来完成它,不包括当前会话您可以使用tty
获取当前shell,并“清理”它以获得第二个斜杠后的数据,如下所示:
current=$(tty | cut -d/ -f3-)
然后,将所有结果打印在ps-o pid,tty,comm
中,其第二列与当前列不匹配…并省略标题:
ps -o pid,tty,comm | awk -v current="$current" 'NR>1 && $2!=current {print $1}'
然后,您可以循环使用这个结果,并杀死给定的PID。试试这个
pts=$( tty | sed 's/\/dev\(*\)/\1/' )
current=$( ps -C sh | grep $pts | ps -o pid= | head -n 1 )
total=$(ps -C sh -o pid= )
for i in $total ; do
if [[ $i -ne $current ]] ; then
kill -9 $i
fi
done
您可以在此ps
中使用awk管道中的$
:
ps -o pid,tty,comm | awk -v curr=$$ '$3 ~ /sh/ && $1 != curr'
变量$$
表示当前shell的PID
pgrep -u $USER | grep -v "`pgrep -s 0`" | xargs kill
这将获取当前用户的所有PID列表,并删除当前会话的PID。然后通过xargs提供所有PID以终止。我使用此PID:
#!/bin/bash
current=$(tty | cut -d/ -f3-)
all=$(ps -A -o tty | grep pts/ | grep -v $current)
for i in $all ; do
pkill -9 -t $i
done
不是kill-9
(与kill-kill
)而是kill-TERM
。-9
不是强制的意思吗?-9
通常是-kill
,一开始使用程序(包括shell脚本、服务器等)是个坏主意可能准备处理SIGTERM
信号,但他们无法捕获SIGKILL
,这应作为最后手段使用。某些程序(例如数据库服务器、链接器、文字处理器)在执行SIGKILL
之后,可能会使磁盘上的文件处于不一致的状态。这通常是一个坏主意。您可能会在Linux上使用pkill
。您可能希望将其中一个答案(对您帮助最大的答案)标记为已接受,而不是“已解决”.None发布了一个简单但完整的解决方案。我感谢anubhava的贡献。有趣的是,在询问后一分钟,用户vks发布了一行有帮助的内容,但后来他将其删除。我会更好地格式化您的代码!乍一看,您的解决方案应该有效!您在同一行中使用了tail、grep、cut、awk和grep。我确信awk可以同时处理s。很好!我尝试了类似的方法,但您的方法更直接。注意,您可能还想说NR>1
以不获取标题。谢谢@fedorqui,我想/sh/
也会跳过标题行谢谢您提供的$$变量信息。