我正在编写一个小脚本,用于向正在运行的 screen 会话发送命令。这个命令可以停止 screen,但不是立即生效的。我需要等待它完成后才能继续执行脚本的其余部分。
下面是停止 screen 的方法:
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
我该如何做到这一点?
我正在编写一个小脚本,用于向正在运行的 screen 会话发送命令。这个命令可以停止 screen,但不是立即生效的。我需要等待它完成后才能继续执行脚本的其余部分。
下面是停止 screen 的方法:
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
我该如何做到这一点?
我找到了一个解决方案:
你只需要简单地检查屏幕是否仍在运行,并等待(sleep
)一秒钟。
像这样:
while screen -list | grep -q $SCREEN_NAME
do
sleep 1
done
如果您重新连接屏幕会话,则它将自动等待其中的所有进程完成。如果您尝试重新连接已经完成的会话,它将立即出错。
如果您想在“无头”模式下运行,则BrainStone的答案已经足够好了。只需确保唯一命名您的会话($SCREEN_NAME
)。例如使用SCREEN_NAME=$(date +my_screen_thing_+%H%M%S)
来获取时间戳。
wait
或者 wait $!
吗? - inixsoftwarescreen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
基本上会立即返回。它只是将命令发送到屏幕,然后继续执行下一个命令,而不等待屏幕终止。如果我在命令的末尾加上&
,然后使用wait,那么这将在前一个命令发送命令到屏幕后立即继续。 - BrainStonewait
和wait $!
命令。即使您指定要等待的进程ID,wait
命令也只适用于shell的子进程。 - Mark Lakata