如何等待程序启动然后再进行后台操作?

时间:2014-02-06 13:30:56

标签: linux bash

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

问题是,该程序没有自我视野。启动它需要5秒钟,当它初始化时,它会打印一个字符串(“已启动”)到stdout。

我正在寻找创建启动进程的脚本,等待一段时间才能显示字符串,然后继续脚本,指示失败或成功(找到字符串)。

显然这不符合我的要求。

daemon $PROGRAM &

相反

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

2 个答案:

答案 0 :(得分:2)

我认为您可以使用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"

在“已启动确定”通知到达之前,预期不会返回。当它关闭时守护进程获得SIGHUP,但我们忽略了它,因此它继续运行。如果您检查日志文件(watch cat daemon.log),守护程序应该正在搅拌。

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

答案 1 :(得分:1)

如果我了解你,有一个程序需要5秒左右才能启动,但在后台运行。您需要等待此程序启动,此程序仍将打印出“已启动”。

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

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

我们的想法是继续循环,直到您在重定向的输出中打印出“已启动确认”。