Вы очищаете log.txt при втором запуске скрипта? Возможно, вы интерпретируете, что это требует двух появлений вашей строки выхода, когда на самом деле это только один. Поскольку вы используете -f, он будет перечислять все добавленное только после запуска вашего скрипта.
Итак, когда вы первый раз поймаете его, вы получите желаемую линию и уйдете. Вы перезапустите скрипт, он будет игнорировать первый экземпляр, потому что он не будет введен в ваш аргумент -f для tail. Однако следующий случай должен выйти. Если вы загляните в свой журнал, вы увидите две строки LOL CANDY, потому что вы просто следуете за хвостом и не смотрите на то, что уже есть в журнале.
Если вы хотите, чтобы ваш сценарий умирал в любое время, когда эта строка появляется в журнале, вы можете добавить это в начало вашего сценария.
#!/bin/sh
if grep 'LOL CANDY' log.txt; then
echo 'LOL MATCH FOUND'
exit 0
fi
tail -f log.txt | while read line
do
if echo $line | grep -q 'LOL CANDY'; then
echo 'LOL MATCH FOUND'
exit 0
fi
done
Также, если вы хотите избавиться от хвоста -f, вы можете делать то, что я перечислил в первом случае, в бесконечном цикле while (синтаксис может быть неправильным, давно):
#!/bin/sh
while (1)
do
if grep 'LOL CANDY' log.txt; then
echo 'LOL MATCH FOUND'
exit 0
fi
done
Конечно, если ваш лог-файл становится достаточно большим, это потребует много ресурсов и займет много времени.