使用 SSH 退出同名屏幕

使用 SSH 退出同名屏幕

我有一台服务器,启动了几个屏幕。这是我使用时显示的内容screen -ls

 There are screens on:
    12811.screen    (Detached)
    2061.screen (Detached)
    7055.screen (Detached)
    11746.screen    (Detached)
    11740.realscreen    (Detached)
    11740.screen    (Detached)
6 Sockets in /var/run/screen/S-root.

我一直试图同时退出所有同名的屏幕。我知道我可以使用 killall screens 一次退出所有屏幕,但这会杀死所有屏幕,而我只想退出同名的屏幕。

是否有一个 bash 文件可供我使用,可以循环遍历所有屏幕并退出它们?或者是否有其他方法可以退出所有同名屏幕?

答案1

类似这样的方法可以解决问题,通过解析输出screen -ls,仅匹配具有相同名称的屏幕并向它们发送终止消息:

SCREENSTOKILL="screen"
screen -ls | egrep "\.${SCREENSTOKILL}[[:space:]]+\(Detached\)" | cut -d. -f1 | xargs kill

或者,您可以获取所有父屏幕进程 ID(我的屏幕版本上的子进程的全名全部大写),排除要忽略的一个进程,然后终止其余进程:

pgrep -f screen | grep -v '11740' | xargs kill

答案2

尝试这个:

pkill -f 'SCREEN.*\<screen\>'

它会在完整进程命令行中查找所有以“screen”作为单独单词的屏幕会话。它将终止第一个和第三个进程,但不会终止第二个进程,如以下示例输出所示ps

dennis   25514  0.0  0.1   4216  1364 ?        Ss   17:04   0:00 SCREEN -S screen
dennis   25609  0.0  0.1   4216  1364 ?        Ss   17:04   0:00 SCREEN -S realscreen
dennis   25702  0.0  0.1   4216  1360 ?        Ss   17:04   0:00 SCREEN -S screen

如果您有一个screen名为“real screen”或“real.screen”的会话,它也会终止它们。但是,您可以根据需要使用尽可能具体的正则表达式。

相关内容