Regex 如何关闭除当前外壳外的其他外壳?

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

我需要一个简单的脚本来关闭除我当前登录的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 -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/
也会跳过标题行谢谢您提供的$$变量信息。