【发布时间】:2013-08-06 18:37:28
【问题描述】:
我正在编写一个向正在运行的屏幕会话发送命令的小脚本。此命令会停止屏幕,但不会立即停止。我需要等待它完成才能继续脚本的其余部分。
这就是我停止屏幕的方式:
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
我该怎么做?
【问题讨论】:
标签: shell wait gnu-screen terminate
我正在编写一个向正在运行的屏幕会话发送命令的小脚本。此命令会停止屏幕,但不会立即停止。我需要等待它完成才能继续脚本的其余部分。
这就是我停止屏幕的方式:
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
我该怎么做?
【问题讨论】:
标签: shell wait gnu-screen terminate
我找到了解决办法:
您只需检查屏幕是否仍在运行并等待 (sleep) 一秒钟。
像这样:
while screen -list | grep -q $SCREEN_NAME
do
sleep 1
done
【讨论】:
对于*nix 系统,您可以在shell 脚本中使用wait 命令。 wait 也可以使用 PID,因此您可以使用 wait $! 来等待在后台运行的最后一个执行命令。如果您的命令没有在后台运行(命令末尾没有&),那么运行您的脚本将等到该命令完成
【讨论】:
wait还是wait $!?
&,然后使用wait。试试看
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"这个命令基本是立即返回的。它只是将命令发送到屏幕,然后转到下一个命令,而不是等待屏幕终止。如果我将& 放在命令的末尾,然后使用等待,这将在上一个命令将命令发送到屏幕的那一刻继续。
wait 和wait $! 无法工作。 wait 仅适用于 shell 的子代,即使您将进程 ID 指定为 wait。
如果您重新附加屏幕会话,那么它将自动等待,直到完成其中的所有进程。如果您尝试重新连接到已经完成的会话,它会立即出错。
如果你想在“无头”模式下运行,那么 BrainStone 的回答就足够了。请务必以唯一的方式命名您的会话 ($SCREEN_NAME)。 SCREEN_NAME=$(date +my_screen_thing_+%H%M%S) 之类的东西可以获取时间戳。
【讨论】: