1

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

    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 生成的

4

1 回答 1

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

于 2012-12-01T19:35:25.703 回答