Linux 如何等待一个程序启动,然后对其进行后台处理?

Linux 如何等待一个程序启动,然后对其进行后台处理?,linux,bash,Linux,Bash,我在/etc/init.d中为一个程序编写脚本 问题是,程序本身并没有解除监控。启动它需要5秒钟,初始化后,它会向标准输出输出一个字符串(“Started OK”) 我希望创建一个脚本,它启动进程,等待字符串出现,然后继续脚本,指示失败或成功(找到字符串) 显然,这不是我想要的 daemon $PROGRAM & 相当于 (./proc > some_output) & poll_output_for "Started OK" 10 secs or die 我认为您可能

我在
/etc/init.d
中为一个程序编写脚本

问题是,程序本身并没有解除监控。启动它需要5秒钟,初始化后,它会向标准输出输出一个字符串(“Started OK”)

我希望创建一个脚本,它启动进程,等待字符串出现,然后继续脚本,指示失败或成功(找到字符串)

显然,这不是我想要的

daemon $PROGRAM &
相当于

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

我认为您可能可以使用
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
。。。下面是一个expect脚本,它等待输出,然后退出:

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

spawn -ignore SIGHUP ./daemon.sh
expect "Started OK"
Expect在“Started OK”通知到达之前不会返回。当它关闭时,守护进程会得到一个
信号,但是我们忽略了它,所以它会继续运行。如果检查日志文件(
watch cat daemon.log
),守护进程应该正在快速运行


我不认为返回正确的错误代码应该太难,请查看手册以了解更多信息。

如果我理解您的意思,有一个程序启动需要5秒左右,但在后台运行。您需要等待此程序启动,此程序仍将打印“启动正常”

如果此程序启动,在后台运行,但仍连接到控制台,因此它可以写入控制台,则您可以执行以下操作:

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

我们的想法是继续循环,直到您看到重定向输出中打印的“启动正常”。

我猜您没有访问此程序源的权限?我与wpa_Suplicant和dhcpcd的情况类似,我为wpa_Suplicant做了一个丑陋的投票状态解决方案,因为幸运的是它有wpa_cli,当该解决方案返回成功时,我继续说。这会有帮助吗?如果所有其他操作都失败,您可以执行
/program&sleep 10
。这将给程序一个开始的时间。但这样你就无法检测到失败。我将此作为评论而不是答案发布,因为这只是一个解决方法,而不是真正的答案。谢谢,是的,这很有效。很好,除了一件事:需要删除$prog_out_文件或将$prog的输出重定向回stdout。如果使用
tee
?我已经更新了我的例子。你能详细说明一下吗,因为我看不出
tee
在这里有什么帮助?你是说以后杀了T型球(这行不通,因为它也会杀了程序,断了管道)?