【问题标题】:sh screen - Wait for screen to terminatesh screen - 等待屏幕终止
【发布时间】:2013-08-06 18:37:28
【问题描述】:

我正在编写一个向正在运行的屏幕会话发送命令的小脚本。此命令会停止屏幕,但不会立即停止。我需要等待它完成才能继续脚本的其余部分。

这就是我停止屏幕的方式:

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

我该怎么做?

【问题讨论】:

    标签: shell wait gnu-screen terminate


    【解决方案1】:

    我找到了解决办法:

    您只需检查屏幕是否仍在运行并等待 (sleep) 一秒钟。

    像这样:

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

    【讨论】:

    • 有没有办法获取退出码?尝试使用 screen 并行化一些测试。
    • @LeblancMeneses 因为你并不是真的在等待屏幕,而是等待它消失,你不能用这种方法。
    【解决方案2】:

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

    【讨论】:

    • 这不起作用!程序只是运行,不等待它结束!
    • 你试过wait还是wait $!
    • 尝试在后台运行您的脚本:在命令末尾添加&,然后使用wait。试试看
    • 重点是screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"这个命令基本是立即返回的。它只是将命令发送到屏幕,然后转到下一个命令,而不是等待屏幕终止。如果我将& 放在命令的末尾,然后使用等待,这将在上一个命令将命令发送到屏幕的那一刻继续。
    • 屏幕和屏幕的所有子进程都不是启动它们的 shell 的子进程。因此waitwait $! 无法工作。 wait 仅适用于 shell 的子代,即使您将进程 ID 指定为 wait
    【解决方案3】:

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

    如果你想在“无头”模式下运行,那么 BrainStone 的回答就足够了。请务必以唯一的方式命名您的会话 ($SCREEN_NAME)。 SCREEN_NAME=$(date +my_screen_thing_+%H%M%S) 之类的东西可以获取时间戳。

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多