RHEL6 Upstart:重启期间的事件流程

RHEL6 Upstart:重启期间的事件流程

我遇到过这样的情况:RHEL 6.4 服务器发送TERM信号KILL太快,应用程序和数据库还没有机会正常停止。看来 Upstart 过早地将控制权交给了 sysv-rc 脚本。

为了解决这个问题,我尝试在 Upstart 配置中添加sleep和命令。节正在写入系统日志,但睡眠从未完成,因为系统在 10 秒内重新启动。我还添加了一个被忽略的。 loggerpre-scriptkill timeout

# cleanup at system shutdown
# Does stop all on apps, stops monit instances, then does a clean.
start on runlevel [016]

console output
kill timeout 120

task

pre-start script
    logger -s -t "arcsight-services-stopall" "Running pre-start..."
    /etc/init.d/arcsight_services stop
    sleep 60
end script

script
    logger -s -t "arcsight-services-stopall" "Running script..."
    /etc/init.d/arcsight_services shutdown monit
    /etc/init.d/arcsight_services clean all
end script

我知道 Upstart 应该并行化启动/停止过程,但它只会使我的调试尝试陷入瘫痪。

在 RHEL 6 下,发出以下命令后执行的脚本的最终顺序是什么: shutdown -r now

  1. shutdown -r now
  2. ?????
  3. /etc/init/rc.conf(暴发户)
  4. /etc/rc.d/rc(sysv-rc)
  5. ?????
  6. /etc/rc3.d/K*(sysv-rc)
  7. /etc/rc6.d/S*(sysv-rc)
  8. ?????

其他 /etc/init/*.conf 脚本在哪里被调用?

更新:在分析时/etc/rc.d/rc,我发现如果我执行touch /var/run/confirm,进程将进入交互模式,然后我的 sleep 和 logger 命令似乎会执行。这让我很困惑,因为我认为此时 Upstart 已将控制权移交给 sysv-rc。

答案1

虽然这个答案没有解决 RHEL 6 关闭期间执行脚本的顺序问题,但它确实解决了系统在正常停止之前终止进程的问题。

/etc/init/arcsight-services-stopall.conf:

# cleanup at system shutdown
# Does stop all on apps, stops monit instances, then does a clean.

start on starting rc RUNLEVEL=[016]

task
kill timeout 330

pre-start script
    logger -s -t "ArcSight" "ArcSight ESM shutdown initiated..."
    /etc/init.d/arcsight_services shutdown all
    /etc/init.d/arcsight_services shutdown monit
    /etc/init.d/arcsight_services clean all
    sleep 300
end script

script
    logger -s -t "ArcSight" "ArcSight ESM shutdown complete."
end script

关键是修改start on starting rc RUNLEVEL=[016]。通过在刚启动时启动此脚本/etc/init/rc.conf,它会阻塞 5 分钟,然后执行 sysv-rc 脚本。希望在这 5 分钟内,所有 ArcSight 数据库和应用程序都能正常停止。测试表明一切都在 3 分钟内停止,因此 5 分钟应该是安全的延迟。

看到一款价值数百万美元的产品需要客户破解总是令人高兴的。

相关内容