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

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

Каждый раз, когда Ubuntu выпускает обновление безопасности для PostgreSQL, мой сервер OpenERP становится нефункциональным до тех пор, пока я ssh не запустится на сервер и не запустит вручную [ f2]. Я обычно забываю сделать это после того, как сделаю sudo apt-get upgrade.

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

1
задан 13 February 2013 в 21:12

2 ответа

Чтобы уточнить первый вариант 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 at в нижней части сценария. Чтобы сделать изменения более четкими (в случае, если будущие версии 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
3
ответ дан 25 May 2018 в 01:31
  • 1
    Спасибо за публикацию всего этого! Если сервер postgres перезагружен, не должны ли появляться события «stopping-postgresql» и «stop-postgresql», выпущенные до перезапуска? В противном случае службы, которые были бы нарушены перезапуском postgres, могут попытаться поговорить с базой данных во время ее перезапуска. – bdesham 14 August 2015 в 17:07
  • 2
    @bdesham. Проблема с перезапуском - это запуск сценариев restart 9.2 в виде одной команды, между которой останавливается и запускается postgres. Таким образом, передача сигнала остановки / остановки / запуска перед рукой не является правильной - в идеале вы должны были бы остановить остановку, остановить вызов, затем испустить остановку, затем запустить запуск, а затем вызвать запуск. Было бы не так сложно изменить сценарий, чтобы сделать это. – dr jimbob 14 August 2015 в 22:50
  • 3
    @bdesham - отредактируйте ответ, чтобы отразить это. Сигналы по-прежнему могут быть неправильными для перезагрузки (только получение сигналов запуска / запуска, что может быть не самым подходящим способом для обработки). – dr jimbob 14 August 2015 в 22:58

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

0
ответ дан 25 May 2018 в 01:31

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

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