如果我作为守护进程启动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)
您可以使用:
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)