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

  • 本文关键字:屏幕 脚本 Bash 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 的进程(当创建第二个或第三个进程时,无论如何它都会破坏第一个实例)

任何帮助都将不胜感激!

我显示的输出是用屏幕 -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"。

相关内容

  • 没有找到相关文章

最新更新