用于杀死具有相同名称的屏幕的Bash脚本

时间:2012-12-01 18:30:46

标签: bash kill

所以我有一个同时运行多个屏幕的系统,如:

    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

生成的

1 个答案:

答案 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”。