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

5

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

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

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

    
задан Marius Gedminas 13.02.2013 в 16:12
источник

3 ответа

4

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

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

В обоих случаях вы можете использовать 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 на странице.

Если вы решите создать задачу 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

Вы также можете подумать о добавлении строкового тайм-аута

kill timeout 300
    
ответ дан Goran Miskovic 14.02.2013 в 12:12
источник
3

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

Поэтому всякий раз, когда postgres отправляется «start / restart» / «reload» / «force-restart», я отправляю событие «start-postgresql» перед выдачей команды и «start-postgresql» после ее завершения. Аналогично, с «stop», я отправляю событие «stopping-postgresql» перед командой и «stop-postgresql» после его выдачи.

Я показываю только последний блок case ( case "$1" in [...] esac внизу сценария). Чтобы сделать изменения более четкими (в случае, если будущие версии postgres изменяют сценарий 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
    
ответ дан dr jimbob 13.03.2014 в 23:26
0

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

    
ответ дан SISalp 14.02.2013 в 09:26