Лучший ответ, который я могу придумать, это
- Установите время ожидания для чтения,
tail -f logfile | read -t 30 line
- Начните хвост с
--pid=$$
, таким образом, он завершится, когда завершится процесс bash.
Он охватит все возможные случаи (сервер зависает без вывода, сервер завершается, сервер запускается правильно).
Не забудьте запустить свой хвост перед сервером.
tail -n0 -F logfile 2>/dev/null | while read -t 30 line
-F
будет «читать» файл, даже если он не существует (начните читать его, когда он появится). -n0
не будет читать ничего, уже находящегося в файле, поэтому вы можете продолжать добавлять файл журнала вместо того, чтобы каждый раз перезаписывать его, и к стандартному ротационному журналу на нем.
EDIT:
Итак, довольно грубое «решение», если вы используете хвост. Возможно, есть лучшие решения, использующие что-то еще, кроме хвоста, но я должен вам это дать, хвост довольно хорошо вытащил вас из сломанной трубы. «Тройник», который способен обрабатывать SIGPIPE, вероятно, будет работать лучше. Процесс java, активно выполняющий удаление файловой системы с каким-либо сообщением «im alive», вероятно, еще проще подождать.
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
}