Перезапуск аварийного экрана

#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 Да, это была неясная формулировка с моей стороны. Я хотел сказать, что я попытался исправить свой ответ, основываясь на вашем комментарии.