#bash #shell #gnu-screen #inotifywait
#bash #оболочка #gnu-screen #inotifywait
Вопрос:
У меня есть простой скрипт bash, который использует команду inotifywait и на основе выполненной модификации запускает команду rsync. Это делается в бесконечном цикле.
Скрипт запускается в сеансе «screen», но, к сожалению, время от времени он выходит из строя (нет ошибок относительно причины).
Я искал способ «контролировать» этот конкретный экран / скрипт и перезапускать его при сбое, но я изо всех сил пытаюсь найти решение для этого.
Скрипт запускается «screen -AmdS script ./script.sh «.
Пример сценария:
#!/usr/bin/bash
while inotifywait --exclude "(.log)" -r -e modify,create,delete /home/backups/
do
rsync -avz -e --update --rsh='ssh -pxxxxx' /home/backups/* user@target:/location/ --delete --force
done
Итак, мой вопрос в основном заключается в том, есть ли способ отслеживать сеанс «экрана» и, если он останавливается, запускать новый, или есть другой способ постоянно запускать этот скрипт и перезапускать его (возможно, не используя screen).).
Ответ №1:
Вы можете повторно запускать свой сбойный скрипт в цикле, пока он не завершится успешно. Вы можете сделать это с помощью
screen -AmdS script bash -c 'until ./script.sh; do echo "Crashed with exit code $?. Restaring."; sleep 1; done'
Каждый раз, когда ваш скрипт завершается с ошибкой, будет выводиться сообщение о сбое вашего скрипта и о том, какой код выхода у него был, сделайте паузу на 1 секунду, а затем повторно запустите ваш скрипт. Как только ваш скрипт завершится успешно (т. Е. ./script.sh
Завершится ненулевым кодом выхода), Цикл завершится.
Обратите внимание, что если ваш скрипт никогда не завершается успешно, это бесконечный цикл.
Ответ №2:
Редактировать: попытка быть более ясным
Вы могли бы просто выдать
until ./script.sh ; do echo crashed ; sleep 1 ; done
в вашем терминале. Это перезапустит скрипт всякий раз, когда он завершает работу с ненулевым результатом.
Комментарии:
1. Я относительно новичок в написании сценариев. Я попытался запустить скрипт, как было предложено, но я получаю: -bash: синтаксическая ошибка рядом с неожиданным токеном «готово» Что я сделал, так это создал новый скрипт и запустил его на экране (scriptception …): #!/bin/bash до тех пор, пока ./script.sh сбой скрипта «do echo» произошел. Перезапуск «спящий режим 1 завершен
2. Как говорит @ShaneBishop, извините за это, надеюсь, у вас все получилось
3. @ThomasStenhaug Пожалуйста, отредактируйте свой ответ, чтобы исправить синтаксическую ошибку. Ответы должны быть автономными и не требовать от читателя ссылки на комментарии, тем более что комментарии могут быть удалены.
4. @ShaneBishop Да, это была неясная формулировка с моей стороны. Я хотел сказать, что я попытался исправить свой ответ, основываясь на вашем комментарии.