【问题标题】:How wait for a program to start up and then background it? [closed]如何等待一个程序启动然后后台呢? [关闭]
【发布时间】:2014-03-03 11:41:54
【问题描述】:

我有一个程序,我正在为/etc/init.d 编写脚本。

问题是,程序不会自行去恶魔化。启动它需要大约 5 秒,当它初始化后,它会在标准输出中打印一个字符串(“Started OK”)。

我正在寻找启动该过程的脚本,等待一段时间字符串出现,然后然后继续脚本,指示失败或成功(找到字符串)。

显然这不能如我所愿。

daemon $PROGRAM &

相当

(./proc > some_output) &
poll_output_for "Started OK" 10 secs or die

【问题讨论】:

  • 我猜你没有访问这个程序的源代码?我在使用 wpa_supplicant 和 dhcpcd 时遇到了类似的情况,我做了一个丑陋的解决方案来轮询 wpa_supplicant 的状态,因为幸运的是它有 wpa_cli,当那个返回成功时,我继续。
  • 如果一切都失败了,你可以做./program & sleep 10。这将使程序有时间启动。但是您将无法以这种方式检测故障。我将其发布为评论而不是答案,因为它只是一种解决方法而不是真正的答案。

标签: linux bash


【解决方案1】:

我认为您可以使用expect 来执行以下操作:请参阅http://expect.sourceforge.net/http://en.wikipedia.org/wiki/Expect。这在许多发行版的存储库中,例如在 Ubuntu 上你可以apt-get install expect

他是一个模拟你的守护进程的脚本:

#/usr/bin/env /bin/bash
# daemon.sh

sleep 2
echo Started OK
while :; do sleep 1; echo '.' >> daemon.log; done

...这是一个等待输出然后退出的期望脚本:

#!/usr/bin/env /usr/bin/expect

spawn -ignore SIGHUP ./daemon.sh
expect "Started OK"

在“开始正常”通知到达之前,Expect 不会返回。当它关闭时,守护进程会得到一个SIGHUP,但我们忽略了它,所以它继续运行。如果您检查日志文件 (watch cat daemon.log),则该守护程序应该正在运行。

我认为期望返回适当的错误代码应该不会太难 - 请查看手册页以获取更多信息。

【讨论】:

    【解决方案2】:

    如果我理解你的话,有一个程序需要 5 秒左右才能启动,但在后台运行。需要等待本程序启动,本程序仍会打印出“Started OK”。

    如果这个程序启动,在后台运行,但仍然连接到控制台,所以它可以写入控制台,你也许可以这样做:

    $prog | tee $prog_out_file
    while true
    do
        sleep 2
        grep -q "Started Ok" $prog_out_file && break
    done
    # Continue here...
    

    我们的想法是继续循环,直到在重定向的输出中看到“Started Ok”打印出来。

    【讨论】:

    • 谢谢,是的,这行得通。很好,除了一件事:需要删除 $prog_out_file 或将输出重新重定向回标准输出以获取 $prog。
    • 如果您使用tee 会怎样?我已经更新了我的示例。
    • 嗯。您能否详细说明一下,因为我看不到 tee 在这里可以提供什么帮助?您的意思是稍后杀死 tee(这不会起作用,因为它也会杀死 prog,损坏的管道)?
    猜你喜欢
    • 2014-01-26
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2011-05-24
    • 2021-02-06
    相关资源
    最近更新 更多