当另一个服务重新启动时,我怎样才能告诉 upstart 重新启动一个服务?

当另一个服务重新启动时,我怎样才能告诉 upstart 重新启动一个服务?

我的一台服务器上运行着一个 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-postgresqlstop 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。问题是它要求您使用脚本来更新您的服务器。我没有使用别名。

相关内容