У меня на одном из моих серверов запущен сервер OpenERP. Он начинается по традиционному сценарию /etc/init.d/
. Он использует базу данных PostgreSQL и нуждается в ручном перезапуске каждый раз при перезапуске PostgreSQL.
Каждый раз, когда Ubuntu выпускает обновление безопасности для PostgreSQL, мой сервер OpenERP перестает функционировать, пока я не ssh к серверу и не запускаю вручную sudo /etc/init.d/my-openerp restart
. Я обычно забываю делать это после того, как я делаю sudo apt-get upgrade
.
Могу ли я настроить upstart, чтобы сделать это для меня каждый раз, когда ag перезапускает postgresql?
Поскольку сервер postgresql по-прежнему использует устаревший сценарий инициализации 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 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]Я написал скрипт, в котором я создал функцию -system-update, которая останавливает openerp, обновляет систему с помощью apt-get upgrade, затем запускает openerp, затем перезапускает веб-клиент в случае версии < 6.1. Проблема в том, что для обновления вашего сервера вам нужно использовать скрипт. Я не использовал псевдоним.
Для разработки первую опцию 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