Как сохранить работоспособность графического приложения, даже если оно падает?
Я использую Gnome Do как средство запуска для большинства вещей. Он настроен на запуск при входе в систему и большую часть времени находится в фоновом режиме, ожидая, пока я нажму сочетание клавиш. Примерно раз в неделю это падает. Я растираю свой ярлык, и ничего не происходит. Я должен перезапустить его.
Это не удивительно раздражает, но я хотел бы знать, есть ли какие-нибудь хорошие способы гарантировать, что настольные приложения продолжают работать вечно. Если они умирают, они перезапускаются (возможно, с таймаутом сбоя, поэтому, если он падает при нагрузке, он не будет пытаться запускать его снова и снова и снова).
Я знаю, что некоторые приложения делают это. На Gnome2, если панель gnome не запущена, система заставляет ее загружаться. Есть ли простой способ использовать эту логику (конечно, не нарушая Gnome).
Я не хочу, чтобы этот вопрос был слишком специфичным для Gnome Do или даже для Gnome, потому что у меня есть несколько приложений для решения (я запускаю Boxee на рабочем столе OpenBox в нашем медиацентре), и я уверен, что у всех других есть свои свои проблемы, которые они хотели бы решить с помощью чего-то подобного.
2 ответа
Еще одно не очень элегантное решение:
#!/bin/bash
threshold=2
program="$1"
while true; do
start=$(date +%s)
"$program"
ret_val=$?
stop=$(date +%s)
if [[ ret_val -eq 0 ]]; then
# normal exit, quit
exit 0
else
# abnormal exit, check runtime. if < threshold quit
runtime=$((stop - start))
if [[ runtime -lt $threshold ]]; then
echo "crash on start"
exit 1
fi
fi
done
Это перезапустится, если программа (первый аргумент) завершит работу с кодом возврата!= 0 и запустится как минимум через пороговые секунды.
Я пытался создать задание Upstart, используя параметры пределов респауна и респауна, но это как-то не получилось.
Простым, если не особенно элегантным, решением было бы запустить приложение из скрипта в цикле, так что
#!/bin/bash
while true
do
gnome-do # or application of choice
sleep 10 # prevent super-spawn rates
done
Хотя это может быть проверено для каждого приложения, поскольку bash не останавливается для всех программ...
Вы также можете адаптировать его для проверки кодов ошибок, чтобы он только появлялся в случае сбоя приложения, а не закрывался.