Сценарий оболочки для перезапуска процесса, если это производит определенную часть текста

У меня есть программа Python, которая, время от времени, отказывает за многими различными исключениями обычно из-за сетевых проблем. Единственный способ заставить это работать состоит в том, чтобы перезапустить его. Как я записал бы сценарий оболочки для выполнения процесса, постоянно проверяйте, говорит ли какой-либо вывод Error и раз так закончите процесс и перезапустите команду (давайте назовем его ./command.sh)?

Для этого было бы хорошо быть на любом другом языке (python/perl и т.д.).

3
задан 14 June 2011 в 21:55

2 ответа

Так как Python выходит с кодом возврата! = 0, когда это выдает исключение, можно просто выполнить этот сценарий оболочки:

while ! ./command.sh ; do : ; done

Конечно, если Вы просто хотите выполнить команду все время, просто запишите:

while true ; do ./command.sh ; done

(это принимает ./command.sh не разветвляется и выходит),

3
ответ дан 1 December 2019 в 15:47

Я сделал что-то подобное для восстановления Теда (Загрузчик Эпизода Потока) от его регулярных катастрофических отказов. Ниже сценарий, который я использовал. Объяснит это в дальнейших редактированиях, когда я иду.

Править: Как это работает

У Ted есть файл журнала. Так как это проверяет на новые эпизоды каждое полчаса, существует метка времени в том журнале, это не является более старым, чем полчаса. Конечно, метка времени не там если Тед, разрушенный тем временем.

Править: Как это могло бы помочь Вам

Вы могли перенаправить вывод своей проблематичной программы в файл. Запишите сценарий, подобный моему, который проверяет этот файл. Если это находит плохую строку там, перезапускает приложение (и удаляет выходной файл). Вы можете, запустил скрипт в бесконечном цикле, или используйте крон. Я принял решение использовать крон, таким образом, у меня есть меньше загрязнения процесса, и проверки не должны быть невероятно частыми так или иначе.

#!/bin/bash
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 con-f-use@gmx.net.
# Use permitted under MIT license:
# http://www.opensource.org/licenses/mit-license.php (NO WARRANTY IMPLIED)

teddir='/home/confus/ted'   # Location of the ted executable
logpath='/home/confus/.Torrent Episode Downloader/log.txt' # Location of ted's log

# Get the process id for ted so it can be killed later
pid=$(lsof "$teddir/ted.jar" | grep -m1 java )
set -- $pid
pid=$2
echo "Ted is running unter pid: $pid."

# Check if the log is recent
search=$(date "+%b %d, %Y @ {0,1}%l:[0-9]{2} %p")
search=$(cat "$logpath" | grep -oE "$search")

# If ted is running and the log is not recent, kill crashed process and
#+restart it.
if [ -n "$pid" ] && [ ! -n "$search" ]; then
    echo "Killig $pid."
    kill "$pid" || exit 1
    echo "Restarting ted..."
    cd "$teddir"
    /usr/bin/java -jar ted.jar noTray
fi

exit 0

В моем случае был все еще активный процесс для Теда после катастрофического отказа, но Тед ничего не делал. Уничтожает это - процесс, затем можно, конечно, пропустить изодромные с предварением Части.

P.S. Это могло бы или не могло бы быть плохой частью кода. Мог бы быть намного лучший путь, но он работает, и я соединил его в очень короткое время.

2
ответ дан 1 December 2019 в 15:47

Другие вопросы по тегам:

Похожие вопросы: