Bash:获取守护进程屏幕会话的PID

hex*_*ide 8 bash gnu-screen

如果我作为守护进程启动GNU屏幕会话,我将如何以编程方式检索其PID?我不知道输出screen -ls是多么一致 ,所以我想知道如何使用bash的常量之一$$,$!或者更好的替代方法.

我正在启动屏幕screen -dmS screenname.

如何在开始屏幕会话之前或之后立即获得屏幕的PID?

sar*_*old 14

这显示了一个名为的屏幕的pid nameofscreen:

$ screen -ls
There are screens on:
    19898.otherscreen   (07/03/2012 05:50:45 PM)    (Detached)
    19841.nameofscreen  (07/03/2012 05:50:23 PM)    (Detached)
2 Sockets in /var/run/screen/S-sarnold.

$ screen -ls | awk '/\.nameofscreen\t/ {print strtonum($1)}'
19841
$ 
Run Code Online (Sandbox Code Playgroud)


fes*_*s . 8

您可以使用:

screen -DmS nameofscreen
Run Code Online (Sandbox Code Playgroud)

它不会分叉守护进程,让您知道 pid。

如果两个 screen 会话使用相同的名称启动,则解析 screen -ls 的输出可能不可靠。另一种方法是不让 screen 会话分叉进程并自己将其放入后台:

例如,对于现有的初始屏幕会话:

fess@hostname-1065% screen -ls
There is a screen on:
        19180.nameofscreen    (01/15/2013 10:11:02 AM)        (Detached)
Run Code Online (Sandbox Code Playgroud)

使用 -D -m 而不是 -d -m 创建一个屏幕,它不会分叉新进程。把它放在后台并获取它的pid。(使用 posix shell 语义)

fess@hostname-1066% screen -DmS nameofscreen & 
[3] 19431
fess@hostname-1067% pid=$! 
Run Code Online (Sandbox Code Playgroud)

现在有两个屏幕具有相同的名称:

fess@hostname-1068% screen -ls
There are screens on:
        19431.nameofscreen    (01/15/2013 10:53:31 AM)        (Detached)
        19180.nameofscreen    (01/15/2013 10:11:02 AM)        (Detached)
Run Code Online (Sandbox Code Playgroud)

但我们知道其中的区别:

fess@hostname-1069% echo $pid
19431
Run Code Online (Sandbox Code Playgroud)

我们可以准确地要求它退出:

fess@hostname-1070% screen -S $pid.nameofscreen -X quit
[3]  - done       screen -DmS nameofscreen
Run Code Online (Sandbox Code Playgroud)

现在又只剩下原来的了:

fess@hostname-1071% screen -ls 
There is a screen on:
        19180.nameofscreen    (01/15/2013 10:11:02 AM)        (Detached)
Run Code Online (Sandbox Code Playgroud)