У меня есть программа Python, которая, время от времени, отказывает за многими различными исключениями обычно из-за сетевых проблем. Единственный способ заставить это работать состоит в том, чтобы перезапустить его. Как я записал бы сценарий оболочки для выполнения процесса, постоянно проверяйте, говорит ли какой-либо вывод Error
и раз так закончите процесс и перезапустите команду (давайте назовем его ./command.sh
)?
Для этого было бы хорошо быть на любом другом языке (python/perl и т.д.).
Так как Python выходит с кодом возврата! = 0, когда это выдает исключение, можно просто выполнить этот сценарий оболочки:
while ! ./command.sh ; do : ; done
Конечно, если Вы просто хотите выполнить команду все время, просто запишите:
while true ; do ./command.sh ; done
(это принимает ./command.sh
не разветвляется и выходит),
Я сделал что-то подобное для восстановления Теда (Загрузчик Эпизода Потока) от его регулярных катастрофических отказов. Ниже сценарий, который я использовал. Объяснит это в дальнейших редактированиях, когда я иду.
Править: Как это работает
У 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. Это могло бы или не могло бы быть плохой частью кода. Мог бы быть намного лучший путь, но он работает, и я соединил его в очень короткое время.