我有一个程序,我正在/etc/init.d
编写脚本。
问题是,该程序没有自我视野。启动它需要5秒钟,当它初始化时,它会打印一个字符串(“已启动”)到stdout。
我正在寻找创建启动进程的脚本,等待一段时间才能显示字符串,然后继续脚本,指示失败或成功(找到字符串)。
显然这不符合我的要求。
daemon $PROGRAM &
相反
(./proc > some_output) &
poll_output_for "Started OK" 10 secs or die
答案 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...
我们的想法是继续循环,直到您在重定向的输出中打印出“已启动确认”。