我遇到过这样的情况:RHEL 6.4 服务器发送TERM
信号KILL
太快,应用程序和数据库还没有机会正常停止。看来 Upstart 过早地将控制权交给了 sysv-rc 脚本。
为了解决这个问题,我尝试在 Upstart 配置中添加sleep
和命令。节正在写入系统日志,但睡眠从未完成,因为系统在 10 秒内重新启动。我还添加了一个被忽略的。 logger
pre-script
kill 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
?
shutdown -r now
?????
/etc/init/rc.conf
(暴发户)/etc/rc.d/rc
(sysv-rc)?????
/etc/rc3.d/K*
(sysv-rc)/etc/rc6.d/S*
(sysv-rc)?????
其他 /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 分钟应该是安全的延迟。
看到一款价值数百万美元的产品需要客户破解总是令人高兴的。