Как сохранить работоспособность графического приложения, даже если оно падает?

Я использую 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 не останавливается для всех программ...

Вы также можете адаптировать его для проверки кодов ошибок, чтобы он только появлялся в случае сбоя приложения, а не закрывался.

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