我遇到過這樣的情況:在應用程式和資料庫有機會正常停止之前,RHEL 6.4 伺服器發送TERM
訊號的速度太快。 KILL
Upstart 似乎過早地將控制權交給了 sysv-rc 腳本。
為了解決這個問題,我嘗試將命令新增sleep
到logger
Upstart 配置中。該pre-script
節正在寫入 syslog,但睡眠從未完成,因為系統會在 10 秒內重新啟動。我還添加了一個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
,進程進入互動模式,然後我的睡眠和記錄器命令似乎執行。這讓我感到困惑,因為我認為,在那時,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
,它會在執行 sysv-rc 腳本之前阻塞 5 分鐘。希望在那 5 分鐘內,所有 ArcSight 資料庫和應用程式都能正常停止。測試表明一切都在 3 分鐘內停止,因此 5 分鐘應該是安全的延遲。
看到價值數百萬美元的產品需要客戶破解總是令人高興的。