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

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

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

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

Поскольку сервер 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 на runlevel [2345], возможно, скажет

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

или

 start on started networking 

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

 kill timeout 300 

Чтобы уточнить первый вариант 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 

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