我过去已经启动了一些通过screen
命令启动的进程。大多数脚本已经完成运行,但看起来屏幕仍然闲置。当我执行 aps aux | less
查看所有进程时,我可以看到它们。
我如何查看所有screen
s 以及它们中是否有活动脚本正在运行。
谢谢
答案1
要查看当前正在运行的屏幕列表:
screen -list
屏幕名称的第一部分是其 PID。要查看从该父进程生成的当前正在运行的进程树,请运行:
pstree <PID>
或者,为了获得更详细的输出,
pstree -a <PID> | less
要重新连接到屏幕(如果已连接到其他地方,则将其分离),请运行:
screen -rd <PID>
一旦确定不再需要某个屏幕,要终止它,您有几个选择。如果您当前连接到屏幕,则只需使用Ctrl+ a, k,这将杀死屏幕及其所有窗口。
或者,如果您未加入会话,则可以使用:
kill <PID>
screen -wipe <PID>
杀死它并将其从屏幕列表中删除。
答案2
您可以screen
通过在脚本完成时终止 shell 来防止脚本完成后闲置:
script.sh; exit
或者,如果您想有机会查看错误消息,您可以运行
script.sh && exit
这样,只有成功完成screen
才会关闭。script.sh
答案3
使用这个管道我可以获得与非活动屏幕对应的 PID 列表
screen -list | sed '1d;$d' | sed -r 's/^[^[0-9]]*([0-9]*).*$/\1/' | xargs -n1 pstree -p | sed -r 's/.*bash\(([0-9]+)\)$/\1/' | grep "^[0-9]*$"
例如:
> screen -list
There are screens on:
8988.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 09:02:14 PM) (Detached)
8960.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 09:01:40 PM) (Detached)
8927.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 09:01:02 PM) (Detached)
8903.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 09:00:42 PM) (Detached)
8857.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 08:59:30 PM) (Detached)
8831.pts-0.ubuntu-1gb-sfo1-01 (07/09/2018 08:59:01 PM) (Detached)
6 Sockets in /var/run/screen/S-user.
> screen -list | sed '1d;$d' | sed -r 's/^[^[0-9]]*([0-9]*).*$/\1/' | xargs -n1 pstree -p
screen(8988)───bash(8989)
screen(8960)───bash(8961)
screen(8927)───bash(8928)
screen(8903)───bash(8904)
screen(8857)───bash(8858)───python(8877)───{python}(8881)
screen(8831)───bash(8832)───python(8851)───{python}(8855)
前 4 个是不活动的,所以接下来就是挑选这些 PID 的问题,这可以通过sed -r 's/.*bash\(([0-9]+)\)$/\1/' | grep "^[0-9]*$"
这样做的好处是我可以用一行杀死所有非活动屏幕:
screen -list | sed '1d;$d' | sed -r 's/^[^[0-9]]*([0-9]*).*$/\1/' | xargs -n1 pstree -p | sed -r 's/.*bash\(([0-9]+)\)$/\1/' | grep "^[0-9]*$" | xargs -n1 kill