等待screen终止

6

我正在编写一个小脚本,用于向正在运行的 screen 会话发送命令。这个命令可以停止 screen,但不是立即生效的。我需要等待它完成后才能继续执行脚本的其余部分。

下面是停止 screen 的方法:

screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"

我该如何做到这一点?

3个回答

11

我找到了一个解决方案:

你只需要简单地检查屏幕是否仍在运行,并等待(sleep)一秒钟。

像这样:

while screen -list | grep -q $SCREEN_NAME
do
    sleep 1
done

有没有办法获取退出代码?尝试使用 screen 并行化一些测试。 - Leblanc Meneses
@LeblancMeneses,由于您实际上不是在等待屏幕,而是在等待它消失,因此您无法使用此方法。 - BrainStone

0

如果您重新连接屏幕会话,则它将自动等待其中的所有进程完成。如果您尝试重新连接已经完成的会话,它将立即出错。

如果您想在“无头”模式下运行,则BrainStone的答案已经足够好了。只需确保唯一命名您的会话($SCREEN_NAME)。例如使用SCREEN_NAME=$(date +my_screen_thing_+%H%M%S)来获取时间戳。


0
对于*nix系统,您可以在shell脚本中使用wait命令。wait命令也可以接受PID作为参数,因此您可以使用wait $!来等待在后台运行的最后一个执行的命令。如果您的命令没有在后台运行(命令结尾没有&符号),那么运行脚本将会等待该命令执行完成。

2
这不起作用!程序只是运行而不等待它结束! - BrainStone
你尝试过使用 wait 或者 wait $! 吗? - inixsoftware
尝试在后台运行您的脚本:在命令的末尾添加“&”,然后使用“wait”。试试看。 - inixsoftware
1
重点在于命令screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"基本上会立即返回。它只是将命令发送到屏幕,然后继续执行下一个命令,而不等待屏幕终止。如果我在命令的末尾加上&,然后使用wait,那么这将在前一个命令发送命令到屏幕后立即继续。 - BrainStone
1
屏幕和屏幕的所有子进程不是启动它们的shell的子进程。因此,无法使用waitwait $!命令。即使您指定要等待的进程ID,wait命令也只适用于shell的子进程。 - Mark Lakata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接