我有一台服务器,启动了几个屏幕。这是我使用时显示的内容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”的会话,它也会终止它们。但是,您可以根据需要使用尽可能具体的正则表达式。