关闭一个屏幕(但不是所有屏幕)

关闭一个屏幕(但不是所有屏幕)

我在 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 仅返回您想要终止的屏幕的名称。

相关内容