我在 Ubuntu 服务器上运行了多个屏幕,其启动方式如下:
screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...
我需要关闭一个屏幕,但不是全部。关闭特定屏幕(带名称)的正确命令是什么?我已阅读手册页但我似乎找不到我正在寻找的命令。
另外我想把这个命令写进一个 bash 脚本,这样我就不能简单地screen -r screen1
然后像平常一样按Ctrl+ 。X
答案1
来自手册页:
-X Send the specified command to a running screen session. You can
use the -d or -r option to tell screen to look only for attached
or detached screen sessions. Note that this command doesn't work
if the session is password protected.
你可以做 :
screen -X -S <sessionid> kill
答案2
如果你执行screen -list
,你会注意到每个屏幕名称都以一个数字开头,这是屏幕的 PID:
$ screen -list
There are screens on:
12281.pts-1.jonah (12/21/2009 07:53:19 PM) (Attached)
10455.pts-1.jonah (12/19/2009 10:55:25 AM) (Detached)
2 Sockets in /var/run/screen/S-raphink.
从那里,只需向这个特定的 PID 发送一个 KILL 信号:
$ kill 12281
并且它将关闭特定的屏幕。
答案3
如果您有多个同名的屏幕,您可以立即终止它们:
screen -ls | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
命令
screen -ls
打印屏幕及其进程号。例如,4773.测试是带有进程号的屏幕4773和名字测试. 输出样例:6322.ss (05/23/2018 10:39:08 AM) (Detached) 6305.sc (05/23/2018 10:38:40 AM) (Detached) 6265.ScreenName (05/23/2018 10:37:59 AM) (Detached) 6249.ScreenName (05/23/2018 10:37:50 AM) (Detached) 6236.scc (05/23/2018 10:37:42 AM) (Detached)
egrep
通过管道发送的示例文本上方的命令过滤器|。- 命令
awk -F "." '{print $1}'
提取每行的第一列。列之间的分隔符定义为点 (.)按选择-F - 最后,命令
xargs kill
将杀死所有通过管道 | 发送其编号的进程。xargs
当我们想要对每个输入执行一个命令时使用它。
答案4
我一直按如下方式处理此问题:
process=$(screen -ls | grep screen1)
kill $(echo $process | cut -f1 -d'.')
exit
解释是,您获取输出screen -ls
并使用 grep 找到您感兴趣的特定屏幕,然后将该字符串分配给变量process
。
由于输出screen -ls
始终是 PID 后跟一个句点,因此您可以使用 cut 来删除句点及其后的所有内容。在上面的例子中,我们将其放在括号中并将其提供给 kill 命令,尽管您可以线性地执行它,这可能包括写入临时文件并从中读取。
您需要确保您的屏幕名称是唯一的,并且 grep 仅返回您想要终止的屏幕的名称。