gpt4 book ai didi

regex - 如何关闭除current之外的其他shell?

转载 作者:行者123 更新时间:2023-11-29 09:14:35 25 4
gpt4 key购买 nike

我需要一个简单的脚本来关闭除我当前登录的那个之外的其他 shell/ session 。我坚持使用这一行:

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

这会导致选择当前 shell。

例如:

 1346 136,0  sh
1355 136,1 sh

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

最佳答案

这实际上并不像一开始看起来那么容易。主要挑战是 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;

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

然后,我在 kill 管道周围应用了保护措施,以确保它仅在我们从解析命令成功获取 $pidCol 时运行。

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

关于regex - 如何关闭除current之外的其他shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28582898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com