我的一台服务器上运行着一个 OpenERP 服务器。它由传统/etc/init.d/
脚本启动。它使用 PostgreSQL 数据库,每次重新启动 PostgreSQL 时都需要手动重新启动。
每次 Ubuntu 发布 PostgreSQL 的安全更新时,我的 OpenERP 服务器就会无法运行,直到我 ssh 到服务器并手动运行sudo /etc/init.d/my-openerp restart
。我通常在执行完后忘记这样做sudo apt-get upgrade
。
每次通过 apt 重新启动 postgresql 时,我可以配置 upstart 来为我执行此操作吗?
答案1
由于 postgresql 服务器仍在使用已弃用的 System-V init 脚本,因此有两个选项:
- 从现有的 System-V init 脚本发出事件
- 将现有的 System-V init 脚本移植到 upstart 作业
在这两种情况下,您都可以在工作中使用。正如评论中提到 start on started-postgresql
的stop on stopping-postgresql
我的 openerp将始终在已启动/已停止时启动/停止PostgreSQL并且不仅仅是升级后。
如果您选择从现有的 System-V init 脚本发出事件,则需要在 /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 配置这里。
我会尝试一下,而不是在运行级别 [2345] 上启动 postgresql,也许会说
start on filesystem and net-device-up IFACE!=lo
或者
start on started networking
您可能还考虑添加 kill timeout 节
kill timeout 300
答案2
详细说明施科维奇第一个选项,这是对 System V/etc/init.d/postgresql
脚本的一个简单修改。
因此,每当向 postgres 发送“start/restart”/“reload”/“force-restart”时,我都会在发出命令之前发送“starting-postgresql”事件,并在命令完成后发送“started-postgresql”。同样,对于“stop”,我在命令之前发送“stopping-postgresql”事件,并在命令发出后发送“stopped-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
答案3
我写了一个脚本,其中我创建了一个 -system-update 函数,它会停止 openerp,通过 apt-get upgrade 更新系统,然后启动 openerp,然后在版本 < 6.1 的情况下重新启动 web-client。问题是它要求您使用脚本来更新您的服务器。我没有使用别名。