Есть Shell скрипт, внутри которого запускается сервис/демон и его stdout пишется в log, затем скрипт продолжает заниматься своими обязанностями:
service -a -b -c &>>log &
Время от времени сервис перестаёт отвечать на запросы, а в log пишет бесконечные строки «Invalid argument».
Задача: при обнаружении Shell скриптом строки «Invalid argument» перезапускать сервис. Можно было конечно каждые несколько секунд считывать последнюю строку из log и сравнивать её с шаблоном, но файл log достаточно большой и каждое считывание файла занимает время, поэтому хотелось бы чтобы stdout поступал сначала в переменную $var, а затем в файл log, при этом необходимо, чтобы $var можно было в любой момент считать. Если такое возможно, подскажите как реализовать?
main() {
service -a -b -c | while read line; do
if [ "$line" = "" ]; then
continue
fi
if [ "$line" = "Invalid argument" ]; then
main "$@"
return 0
fi
echo "$line" >> /var/log/service.log
done
}
main "$@"
А если посмотреть с другой стороны — проблему надо решать в сервисе, ведь именно ему не нравятся аргументы. Вот его и надо править — сделать нормальный валидатор аргументов и починить, чтобы не переставал отвечать.
Само собой, но у меня нет исходников и сам править я не буду. Когда разработчик сервиса выпустит обновление с исправлением данного бага, я обязательно скачаю, а пока выкручиваюсь как могу.
Нет. Данная программа для Android, единственная в своём рабочем экземпляре, остальные несовместимы.
micronekodesu
А чего бы tail'ом не читать?
Сейчас так и делаю.
legolegs
Перезапускать можно обычными способами, как при помощи systemd так и банальным while true; do service ....; done
Да, сейчас делаю killall и перезапуск через while.
Мне вот интересно в варианте от Spoofing - если сервис будет молчать, то там while с if [ «$line» = «» ]; then continue fi получается зацикленным постоянно, следовательно будет сильно отжирать CPU или нет?