我正在尝试编写一个bash脚本来做一些事情,启动一个进程,等待该进程说它已准备好,然后在该进程继续运行时再做更多的事情。我遇到的问题是找到一种方法,在继续之前等待该过程准备就绪,并允许它继续运行。
在我的具体情况下,我正在尝试建立PPP连接。在运行下一个命令之前,我需要等到它已连接。如果PPP无法连接,我还想停止脚本。 pppd打印到stdout。
在psuedo代码中,我想要做的是:
[some stuff]
echo START
[set up the ppp connection]
pppd <options> /dev/ttyUSB0
while 1
if output of pppd contains "Script /etc/ppp/ipv6-up finished (pid ####), status = 0x0"
break
if output of pppd contains "Sending requests timed out"
exit 1
[more stuff, and pppd continues to run]
echo CONTINUING
关于如何做到这一点的任何想法?
答案 0 :(得分:15)
我必须做类似的事情,等待/ var / log / syslog中的一行出现。这对我有用:
FILE_TO_WATCH=/var/log/syslog
SEARCH_PATTERN='file system mounted'
tail -f -n0 ${FILE_TO_WATCH} | grep -qe ${SEARCH_PATTERN}
if [ $? == 1 ]; then
echo "Search terminated without finding the pattern"
fi
它会将附加到监视文件的所有新行管道为grep,并指示grep在发现模式后立即安静地退出。以下if语句检测是否等待&#39;在没有找到模式的情况下终止。
答案 1 :(得分:2)
有一个名为“Expect”的工具几乎可以完全满足您的需求。更多信息:http://en.wikipedia.org/wiki/Expect
您还可以查看“聊天”的手册页,这是一个pppd功能,可以完成一些预期可以做的事情。
答案 2 :(得分:1)
我想出的最快的解决方案是在后台运行带有nohup的pppd并检查nobup.out文件中的stdout。结果是这样的:
sudo nohup pppd [options] 2> /dev/null &
# check to see if it started correctly
PPP_RESULT="unknown"
while true; do
if [[ $PPP_RESULT != "unknown" ]]; then
break
fi
sleep 1
# read in the file containing the std out of the pppd command
# and look for the lines that tell us what happened
while read line; do
if [[ $line == Script\ /etc/ppp/ipv6-up\ finished* ]]; then
echo "pppd has been successfully started"
PPP_RESULT="success"
break
elif [[ $line == LCP:\ timeout\ sending\ Config-Requests ]]; then
echo "pppd was unable to connect"
PPP_RESULT="failed"
break
elif [[ $line == *is\ locked\ by\ pid* ]]; then
echo "pppd is already running and has locked the serial port."
PPP_RESULT="running"
break;
fi
done < <( sudo cat ./nohup.out )
done
答案 3 :(得分:0)
如果你选择expect
,@ sblom建议,请检查autoexpect
。
您可以通过autoexpect
命令运行所需的内容,它将创建expect
脚本。
查看man page以获取示例。