我有以下几点。
tail -f
命令检查日志文件中的成功消息。 即使代码中的导出为0,也无法结束
tail -f
进程。这不能让我的脚本完成。在Bash中还有其他方法可以这样做吗?
该代码如下所示。
function startServer() {
touch logfile
startJavaprocess > logfile &
tail -f logfile | while read line
do
if echo $line | grep -q 'Started'; then
echo 'Server Started'
exit 0
fi
done
}
最佳答案
我能想到的最好的答案是
tail -f logfile | read -t 30 line
--pid=$$
开头tail,这样它将在bash进程完成后退出。 它涵盖了我能想到的所有情况(服务器挂起,没有输出,服务器退出,服务器正常启动)。
不要忘记在服务器之前启动自己的尾巴。
tail -n0 -F logfile 2>/dev/null | while read -t 30 line
即使文件不存在,
-F
也会“读取”文件(出现时开始读取文件)。 -n0
不会读取文件中的任何内容,因此您可以继续追加到日志文件中,而不必每次都覆盖它,并可以对其进行标准日志轮转。编辑:
好吧,如果您使用的是尾巴,那么这是一个粗略的“解决方案”。除尾巴外,可能还有其他更好的解决方案,但我必须将其提供给您,尾巴可以很好地将您从残管中解脱出来。能够处理SIGPIPE的“tee”可能会更好。主动执行文件系统删除并带有某种“im alive”消息的java进程可能更容易等待。
function startServer() {
touch logfile
# 30 second timeout.
sleep 30 &
timerPid=$!
tail -n0 -F --pid=$timerPid logfile | while read line
do
if echo $line | grep -q 'Started'; then
echo 'Server Started'
# stop the timer..
kill $timerPid
fi
done &
startJavaprocess > logfile &
# wait for the timer to expire (or be killed)
wait %sleep
}
关于bash - 以shell脚本开始的结尾tail -f,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2041437/