我读如何自动启动多个屏幕会话?,但我不明白第一个被接受的答复:
screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"
在我的例子中,我需要为一个脚本自动创建一个屏幕会话,之后我需要在同一个会话中为另一个脚本创建一个新窗口。手动的话,我会:
- 运行屏幕
- 输入命令
- CTRL+A
- CTRL+C
- 输入命令
- CTRL+A
- CTRL+D
我如何在脚本中自动执行此操作?一个简单的示例对我有很大帮助。
谢谢各位的回复。
答案1
我不太确定你想要发生什么 - 你想要一个脚本来为两个命令创建具有两个窗口的屏幕会话,还是你想在运行一个命令的屏幕窗口中运行一个脚本,然后为第二个命令创建一个新窗口?
第二个很简单,让我们从这里开始:
#!/bin/bash
command1
screen command2
在 screen 中运行“screen”将在当前会话中创建一个新窗口,而不是启动一个新窗口。但它会立即返回,因此在最后一行之后,脚本将退出,而 command2 仍在运行。当 command2 完成后,其窗口将关闭。
无论如何,对你的问题的第一个解释有点困难,所以让我们继续解决上述问题:
#!/bin/bash
# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"
# For signalling and stuff
FLAGDIR=$(mktemp -d)
# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc
# Use that temporary screenrc; create a detached session:
screen \
-c ${FLAGDIR}/screenrc \
-d -m \
-S ${SESSION} \
bash -c "command1 ; touch ${FLAGDIR}/done"
# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done
# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2
# Don't need this any more:
rm -rf ${FLAGDIR}
脚本将启动command1
,等待其完成,然后启动command2
并退出。就像您运行一样command1 ; command2 &
,但输出在其他地方。我相信您可以弄清楚如何command1
在后台运行。
答案2
- 启动会话
startup
并在分离窗口中运行command1
添加新的分离窗口并运行
command2
screen -dmS startup bash -c 'command1; exec bash' screen -S startup -x -X screen bash -c 'command2; exec bash'
startup
随时重新连接会话
screen -r startup
答案3
screen -dm
在后台创建一个运行您指定的命令的会话。
所以如果你把
screen -dm vi xxx
screen -dm vi yyy
在您的脚本中,您将有 2 个会话,一个编辑 xxx,一个编辑 yyy。
screen -ls
将列出会话,您可以使用screen -r <session number>
这不太方便,因为需要找到会话编号。这就是它的作用-S
所在。
screen -dmS session1 vi xxx
将创建一个名为 session1 的独立会话,因此如果你将脚本更改为
screen -dmS session1 vi xxx
screen -dmS session2 vi yyy
你可以选择要附加的会话screen -r session1
或screen -r session2