所以我有一个同时运行多个屏幕的系统,一个列表如下:
2606.molamola19 (Detached)
13481.johnappy1 (Detached)
26017.Dylkill (Detached)
17061.legoman993 (Detached)
15984.legoman993 (Detached)
7418.taytotayto (Detached)
7336.wpgradford (Detached)
11913.twbone (Detached)
31947.1christiant (Detached)
20124.legoman993 (Detached)
15034.PWNman567 (Detached)
13119.johnappy1 (Detached)
21084.legoman993 (Detached)
9294.Ncraven00 (Detached)
17200.A_Naked_Equinox (Detached)
4331.somegreatvids999 (Detached)
18849.Djfireblade (Detached)
1104.AlfieW5 (Detached)
7926.superhoi (Detached)
27904.ty281998123a (Detached)
14870.johnappy1 (Detached)
4340.stapler12 (Detached)
21244.oas510 (Detached)
21032.jaater (Detached)
14320.johnappy1 (Detached)
15188.sammyboy40 (Detached)
由于与客户端的连接问题,有时会启动同一屏幕的多个实例,例如:
14320.johnappy1 (Detached)
14870.johnappy1 (Detached)
在过去的几天里,我一直在尝试学习 Bash,以弄清楚如何杀死任何超过 1 的进程(当创建第二个或第三个进程时,无论如何它都会破坏第一个实例)
任何帮助都将不胜感激!
我显示的输出是用屏幕 -r 生成的
编辑:添加了解释和更改的命令(请参阅注释杰里米·塞耶斯)
我已经很久没有使用屏幕了,但我想我仍然可以给你正确的提示。首先过滤掉那些实例,你想杀,然后杀掉它们:
screen -r |
sort -t. -k2,2 -k1,1 |
awk 'BEGIN { i=""; FS = "([[:space:]]|\.)+" };{if($2 == i) print $1; i = $2;}' |
while read x; do kill -9 $x; done
解释:
sort -t. -k2,2 -k1,1
首先在名称之后排序(例如 johnappy1),然后在PID(因为我假设你想保持第一个实例启动)。
awk 'BEGIN { i=""; FS = "([[:space:]]|\.)+" };{if($2 == i) print $1; i = $2;}'
将过滤掉所有多个实例并输出更高的 PID其中(仅省略第一个最低的 PID)。
while read x; do kill -9 $x; done
将遍历我们从上一个命令获得的所有 PID,并且将对他们调用"杀死-9"。