前言
systemd服務(wù)異常自動重啟很好用,但有的時候希望某些服務(wù)只在特定情況下進(jìn)行重啟,其他時候不要自動重啟(比如OOM,需要人工介入)。
本文拋磚引玉,旨在能夠讓讀者對systemd的重啟機(jī)制有一定了解。
自動重啟范例
[Unit]
Description=mytest
[Service]
Type=simple
ExecStart=/root/mytest.sh
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
參數(shù)詳解
Restart=always: 只要不是通過systemctl stop來停止服務(wù),任何情況下都必須要重啟服務(wù),默認(rèn)值為no
RestartSec=5: 重啟間隔,比如某次異常后,等待5(s)再進(jìn)行啟動,默認(rèn)值0.1(s)
StartLimitInterval: 無限次重啟,默認(rèn)是10秒內(nèi)如果重啟超過5次則不再重啟,設(shè)置為0表示不限次數(shù)重啟
RestartPreventExitStatus參數(shù)
查詢man systemd.service發(fā)現(xiàn),systemd的[Service]段落里支持一個參數(shù),叫做RestartPreventExitStatus。該參數(shù)從字面上看,意思是當(dāng)符合某些退出狀態(tài)時不要進(jìn)行重啟。該參數(shù)的值支持exit code和信號名2種,可寫多個,以空格分隔,例如:
RestartPreventExitStatus=143 137 SIGTERM SIGKILL
表示,當(dāng)退出情況只要符合以下4種情況中任意一種時候,則不再進(jìn)行重啟
exit code為143
exit code為137
信號為TERM
信號為KILL
注意事項
RestartPreventExitStatus與Restart的關(guān)系
配置RestartPreventExitStatus=后,并沒有完全忽略Restart=,而是指當(dāng)退出情況與RestartPreventExitStatus=匹配的時候,才忽略Restart=,若沒有匹配,根據(jù)Restart=該怎么樣還怎么樣(具體詳見后面的擴(kuò)展部分)
kill子進(jìn)程會是什么情況
若systemd啟動的不是一個簡單進(jìn)程,而是會派生子進(jìn)程的情況(比如執(zhí)行shell腳本,shell腳本里啟動多個程序),那么當(dāng)另外開一個窗口通過kill -信號測試時,會是什么情況呢,測試方法如下:
ExecStart=/root/mem改為ExecStart=/root/mytest.sh
/root/mytest.sh內(nèi)容為
#!/bin/bash
sleep 100000 &
sleep 200000
總結(jié)
Systemd在某些進(jìn)程維護(hù)上還是很方便的,自動重啟在很多業(yè)務(wù)上是有需求的,比如服務(wù)器。但是需要自己做簡單測試才能判斷出來正確狀況。比如很多時候 kill -9 不會自動重啟,就需要考慮到。有些復(fù)雜,需要慢慢理解。