screen 是Linux下的会话管理程序,在运行交互式程序时,可以保持会话,必要时可以切到后台运行,或者从后台恢复会话。
大多数screen使用场景都是在交互式模式运行,如何让screen以静默方式运行,比如批量创建会话并运行任务。
这里要用到screen的两个技巧:
创建一个 detached 状态的会话
向一个已存在的会话发送命令
默认我们使用 -S 参数会创建一个活动会话。如果只创建不打开,可以使用以下参数:
# screen -dmS screenName# screen -lsThere are screens on:30828.screenName (05/18/2022 05:49:21 PM) (Detached)
使用 -d -m 参数会创建一个detached状态的会话,文档中是这样解释的:
-d -m Start screen in "detached" mode.This creates a new session but doesn't attach to it.This is useful for system startup scripts.
向一个会话发送命令的语句为:
screen -xS screenName \-p0 \-X stuff "/bin/bash /test.sh"$'\n'
这里需要解释一下参数说明:
-x Attach to a not detached screen session.
-p number_or_name Preselect a window.
-X Send the specified command to a running screen session.
stuff string
Stuff the string string in the input buffer of the current window.
命令中用到的参数比较长,主要意思就是指定会话名、指定窗口(一个会话可以有多个窗口)、发送命令。其中 -X stuff "string" 是 screen 的很多命令中的一种,一会儿我们还会用到其它命令。
在命令的结尾加了一个$'\n',代表回车换行,这里不能写成$"\n",试过了不生效。这个命令也可以写成两行,一行是内容,一行是回车。
screen -xS screenName -p0 -X stuff "/bin/bash /test.sh"screen -xS screenName -p0 -X stuff $'\n'
非交互地杀掉一个会话,也可以通过发命令的形式:
# screen -lsThere are screens on:30828.screenName (05/18/2022 05:49:21 PM) (Detached)1 Sockets in var/run/screen/S-root.# screen -xS screenName -X quit# screen -lsNo Sockets found in var/run/screen/S-root.
刚才使用的命令是 -X stuff "string",现在退出会话用到的命令是 -X quit,当然它还有其它命令:
quit Kill all windows and terminate screen.
stuff string Stuff the string string in the input buffer of the current window.
select [WindowID] 选择窗口
kill Kill current window.
log [on|off] Start/stop writing output of the current window to a file "screenlog.n"
最后,我们需要注意的是,如果使用 screen -dmS sessionName 创建会话,当多次执行会创建同名会话,只是前缀不同。这会给后面发送命令造成困扰,比如:
# screen -dmS a# screen -dmS a# screen -lsThere are screens on:214038.a (Detached)213282.a (Detached)2 Sockets in /var/run/screen/S-root.
所以需要保证会话名的唯一性,不然就没法通过模糊匹配指定会话名发送命令了。




