Как я могу сказать upstart, чтобы перезапустить сервис, когда другой сервис перезапускается?

У меня на одном из моих серверов запущен сервер OpenERP. Он начинается по традиционному сценарию /etc/init.d/. Он использует базу данных PostgreSQL и нуждается в ручном перезапуске каждый раз при перезапуске PostgreSQL.

Каждый раз, когда Ubuntu выпускает обновление безопасности для PostgreSQL, мой сервер OpenERP перестает функционировать, пока я не ssh к серверу и не запускаю вручную sudo /etc/init.d/my-openerp restart. Я обычно забываю делать это после того, как я делаю sudo apt-get upgrade.

Могу ли я настроить upstart, чтобы сделать это для меня каждый раз, когда ag перезапускает postgresql?

5
задан 13 February 2013 в 19:12

3 ответа

Поскольку сервер postgresql по-прежнему использует устаревший сценарий инициализации System-V, существует две опции:

  • Извлекать события из существующего сценария инициализации System-V
  • Порт существующей System- V init скрипт для запуска задания

В обоих случаях вы можете использовать start on started-postgresql и stop on stopping-postgresql в своей работе. Как упоминалось в комментарии , my-openerp будет запускаться / останавливаться всегда при запуске / останове postgresql , а не только после обновления.

Если вы выберете отправку событий из существующего сценария инициализации System-V, вам нужно будет добавить в /etc/init.d/postgresql:

# just before the service is started
initctl emit starting-postgresql
# just after the service is started
initctl emit started-postgresql 
# just before stopping the service
initctl emit stopping-postgresql
# just after the service is stopped
initctl emit stopped-postgresql

Подробнее см. Полезные советы в Письменные услуги на странице Ubuntu Boot up Howto.

В случае, если вы решите создать задание Upstart, простейшая конфигурация может выглядеть следующим образом:

start on runlevel [2345]
stop on runlevel [016]
respawn

exec su -c "/etc/postgresql/bin/postgres -D /usr/local/pgsql/data" postgres

Более подробную конфигурацию Upstart можно найти здесь .

Я бы поиграл, и вместо запуска postgresql на уровне выполнения [2345], возможно, произнесу

start on filesystem and net-device-up IFACE!=lo

или

start on started networking

Вы также можете рассмотреть возможность добавления раздела об истечении времени ожидания

[ 114]
0
ответ дан 13 February 2013 в 19:12

Я написал скрипт, в котором я создал функцию -system-update, которая останавливает openerp, обновляет систему с помощью apt-get upgrade, затем запускает openerp, затем перезапускает веб-клиент в случае версии < 6.1. Проблема в том, что для обновления вашего сервера вам нужно использовать скрипт. Я не использовал псевдоним.

0
ответ дан 13 February 2013 в 19:12

Для разработки первую опцию schkovich вот, простая модификация к System V /etc/init.d/postgresql сценарий.

Таким образом каждый раз, когда пост-ГРЭС отправляется, "запускают/перезапускают" / "перезагрузка" / "перезапуск силы", я отправляю "стартовое-postgresql" событие, прежде чем команда будет дана, и "запущенный-postgresql" после его законченного. Точно так же с "остановкой", я отправляю "останавливающееся-postgresql" событие перед командой и "остановленный-postgresql" после его выпущенного.

Я только показываю заключительный блок случая (case "$1" in [...] esac в нижней части сценария. Делать изменения более ясными (в случае, если будущие версии пост-ГРЭС изменяют сценарий System V, я выделил строки, которые должны быть вставлены путем помещения их между #### BEGIN emit-upstart-event и #### END emit-upstart-event.

case "$1" in
    start|stop|restart|reload)
        if [ -z "`pg_lsclusters -h`" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        #### BEGIN emit-upstart-event
        case "$1" in
            start|restart|reload)
                initctl emit starting-postgresql
            ;;
            stop)
                initctl emit stopping-postgresql
            ;;
        esac
        #### END emit-upstart-event
        for v in $versions; do
            $1 $v || EXIT=$?
        done
        #### BEGIN emit-upstart-event
        case "$1" in
            start|restart|reload)
                initctl emit started-postgresql
            ;;
            stop)
                initctl emit stopped-postgresql
            ;;
        esac
        #### END emit-upstart-event
        exit ${EXIT:-0}
        ;;
    status)
        LS=`pg_lsclusters -h`
        # no clusters -> unknown status                                                                                                                                                                                                                  
        [ -n "$LS" ] || exit 4
        echo "$LS" | awk 'BEGIN {rc=0} {if (match($4, "down")) rc=3; printf ("%s/%s (port %s): %s\n", $1, $2, $3, $4)}; END {exit rc}'
        ;;
    force-reload)
        #### BEGIN emit-upstart-event
        initctl emit starting-postgresql
        #### END emit-upstart-event
        for v in $versions; do
            reload $v
    done
        #### BEGIN emit-upstart-event
        initctl emit started-postgresql
        #### END emit-upstart-event
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|force-reload|status} [version ..]"
    exit 1
    ;;
esac

Если Вы хотите обработать перезапуск со всеми надлежащими сигналами (путем разделения перезапуска на остановку, и запустить команды) можно сделать:

case "$1" in
    restart)
        ### HANDLING restart as a stop event and then a start event.
        if [ -z "`pg_lsclusters -h`" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        initctl emit stopping-postgresql
        for v in $versions; do
            stop $v || EXIT=$?
        done
        initctl emit stopped-postgresql
        initctl emit starting-postgresql
        for v in $versions; do
            start $v || EXIT=$?
        done
        initctl emit started-postgresql
        ### END HANDLING restart separately
    start|stop|reload)
        if [ -z "`pg_lsclusters -h`" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        #### BEGIN emit-upstart-event
        case "$1" in
            start|reload)
                initctl emit starting-postgresql
            ;;
            stop)
                initctl emit stopping-postgresql
            ;;
        esac
        #### END emit-upstart-event
        for v in $versions; do
            $1 $v || EXIT=$?
        done
        #### BEGIN emit-upstart-event
        case "$1" in
            start|reload)
                initctl emit started-postgresql
            ;;
            stop)
                initctl emit stopped-postgresql
            ;;
        esac
        #### END emit-upstart-event
        exit ${EXIT:-0}
        ;;
    status)
        LS=`pg_lsclusters -h`
        # no clusters -> unknown status                                                                                                                                                                                                                  
        [ -n "$LS" ] || exit 4
        echo "$LS" | awk 'BEGIN {rc=0} {if (match($4, "down")) rc=3; printf ("%s/%s (port %s): %s\n", $1, $2, $3, $4)}; END {exit rc}'
        ;;
    force-reload)
        #### BEGIN emit-upstart-event
        initctl emit starting-postgresql
        #### END emit-upstart-event
        for v in $versions; do
            reload $v
    done
        #### BEGIN emit-upstart-event
        initctl emit started-postgresql
        #### END emit-upstart-event
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|force-reload|status} [version ..]"
    exit 1
    ;;
esac
3
ответ дан 13 February 2013 в 19:12

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

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