LINUX.ORG.RU

Shell. Stdout в переменную, затем в файл

 ,


0

2

Есть 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 "$@"
Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

Интересный вариант, но не понятны две вещи:

1. Зачем рекурсивный запуск скрипта?

2. Не займёт ли так цикл при if [ «$line» = «» ]; then continue fi всё процессорное время?

A27 ()
Ответ на: комментарий от A27

А если посмотреть с другой стороны — проблему надо решать в сервисе, ведь именно ему не нравятся аргументы. Вот его и надо править — сделать нормальный валидатор аргументов и починить, чтобы не переставал отвечать.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Само собой, но у меня нет исходников и сам править я не буду. Когда разработчик сервиса выпустит обновление с исправлением данного бага, я обязательно скачаю, а пока выкручиваюсь как могу.

A27 ()

Вот это будет завершать сервис после первого ‘Invalid argument’:

service -a -b -c 2>&1 | tee log | fgrep -m 1 'Invalid argument'

Перезапускать можно обычными способами, как при помощи systemd так и банальным while true; do service ....; done

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

deep-purple

А ты уже сообщил авторам?

Нет. Об ошибке известно уже два года.

deep-purple

А альтернативных программ нет?

Нет. Данная программа для Android, единственная в своём рабочем экземпляре, остальные несовместимы.

micronekodesu

А чего бы tail'ом не читать?

Сейчас так и делаю.

legolegs

Перезапускать можно обычными способами, как при помощи systemd так и банальным while true; do service ....; done

Да, сейчас делаю killall и перезапуск через while.

Мне вот интересно в варианте от Spoofing - если сервис будет молчать, то там while с if [ «$line» = «» ]; then continue fi получается зацикленным постоянно, следовательно будет сильно отжирать CPU или нет?

A27 ()