如何配置我的 Upstart 脚本以考虑依赖关系?

如何配置我的 Upstart 脚本以考虑依赖关系?

我在一台 Ubuntu 12.04 服务器上安装了 PostgreSQL、Atlassian JIRA、Stash、Confluence 和 Crowd。它们按照 Atlassian 文档集成并运行。

我确实注意到的一件事是,该产品套件不能容忍依赖组件停机。例如,如果 Crowd 停止运行,用户将无法再登录。如果 PostgreSQL 因维护原因停止运行,依赖应用程序可能永远无法恢复。

系统每晚都会进入维护期,在此期间可能会对操作系统和软件进行修补。外部 DNS 已配置为在应用程序出现错误时正常显示维护页面。

有时,PostgreSQL 可能会被停止、修补,然后启动。如何配置 Upstart 脚本以考虑依赖项?我配置了“启动”,但没有效果。

我可以轻松地编写 Windows 服务并在安装期间配置它们的依赖项(例如 Windows 安装程序或 PowerShell)。

测试用例:

  • 我停止了所有服务。然后我启动了 Confluence,以为它会失败(因为 PostgreSQL 和 Crowd 已停止),或者会自动尝试启动 PostgreSQL 和 Crowd。但都没有发生。

  • 我启动了所有服务。然后我停止了 Crowd,以为 Confluence、JIRA 和 Stash 也会停止。结果只是停止了 Crowd,其他所有服务仍在运行,但无法正常运行。

依赖项:

  • 人群:PostgreSQL,网络
  • 合流:PostgreSQL、网络、Crowd
  • 吉拉:PostgreSQL、网络、Crowd
  • :PostgreSQL、网络、Crowd

合流

# confluence

description "Atlassian Confluence"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=confluence
env BASEDIR=/usr/local/bin/confluence

script
    LOGFILE=/var/log/confluence/confluence.`date +%Y-%m-%d`.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

吉拉

description "Atlassian JIRA"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=jira
env BASEDIR=/usr/local/bin/jira

script
    LOGFILE=/var/log/jira/jira.`date +%Y-%m-%d`.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

description "Atlassian Stash"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=stash
env BASEDIR=/usr/local/bin/stash
env STASH_HOME="/var/local/lib/stash"

script
    LOGFILE=/var/log/stash/stash.`date +%Y-%m-%d`.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/start-stash.sh -fg" >> $LOGFILE 2>&1
end script

人群

# crowd

description "Atlassian Crowd - Single Sign-On (SSO) and Identity Management"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345])
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=crowd
env BASEDIR=/usr/local/bin/crowd/apache-tomcat

script
    LOGFILE=/var/log/crowd/crowd.`date +%Y-%m-%d`.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

PostgreSQL 是通过 APT 安装的,并在启动时自动启动。

答案1

尝试:

  • 人群

    start on (net-device-up and started postgresql)
    stop on stopping postgresql
    
  • 合流

    start on started crowd
    stop on stopping crowd
    
  • start on started crowd
    stop on stopping crowd
    
  • 吉拉

    start on started crowd
    stop on stopping crowd
    

参考:http://upstart.ubuntu.com/cookbook/

  • 6.32.2 启动依赖于另一个服务
  • 6.33.2 在依赖的服务前停止

答案2

这会有点困难,因为 postgresql 不是原生 upstart 作业。您需要执行以下操作:

  1. initctl emit -n started JOB=postgresql在 /etc/init.d/postgresql 开始部分的末尾添加以下行
  2. 将此行添加initctl emit stopping JOB=postgresql到 /etc/init.d/postgresql 停止部分的开头
  3. 将人群更改为:

    start on started postgresql
    stop on stopping postgresql
    

就是这样。如果您需要步骤 1 和 2 的帮助,请直接询问。

相关内容