所以我有一个同时运行多个屏幕的系统,如:
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的进程(当创建第二个进程或第三个等等时,它会破坏第一个实例)
任何帮助都会非常感激!
我显示的输出是使用screen -r
生成的答案 0 :(得分:1)
编辑:添加说明和更改命令(请参阅注释 Jeremy Sayers)
自从我使用屏幕以来已经很长时间了,但我想我仍然可以给你正确的提示。 首先过滤掉那些你要杀死的实例,然后杀死它们:
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 将在他们身上调用“kill -9”。