背景
爲了保證系統運行可靠,有時候需要對程序進行監測,當程序異常掛掉的時候能夠自動快速拉起。在一些對時效性要求不那麼高的場景下,使用 crontab 定時檢查也是一個可選方案,本文分享一個簡單的程序保活的方法。
方法
1. 首先,編寫一個 shell 腳本,執行檢查存活和程序拉起的邏輯:
創建一個 check_alive.sh
文件,內容如下(你需要根據自己的需要修改邏輯):
#!/bin/bash
pid_cnts=$(ps -ef | grep ultrahook | grep -v grep | wc -l)
if [ $pid_cnts -eq 0 ];then
echo "No available ultrahook worker, starting one, $(date)"
ultrahook stripe 80 >> /root/ultrahook.log &
sleep 3
cnt=$(ps -ef | grep ultrahook | grep -v grep | wc -l)
if [ $cnt -gt 0 ];then
echo "Restarting ultrahook done."
fi
else
echo "ultrahook working ok, pid_cnts = $pid_cnts, $(date)"
fi
記得賦予腳本執行權限:
# chmod +x check_alive.sh
2. 配置 crontab 定時任務
執行 crontab -e
進入定時任務編輯窗口,設置定時任務(每5分鐘執行一次):
*/5 * * * * /root/check-alive.sh 2&>1 >> /root/check-alive.log
上述方式會將腳本輸出日誌重定向到指定的文件。如果沒有主動重定向,那麼腳本產生的日誌會存儲在用戶郵件消息內(例如 /var/spool/mail/root
)
保存退出後,可以通過執行 crontab -l
查看已經設置的定時任務
# crontab -l
*/5 * * * * /root/check-alive.sh 2&>1 >> /root/check-alive.log
在線生成 crontab 規則的工具:http://tool.lu/crontab
3. 驗證定時任務是否工作
首先,可以通過查看日誌,確定定時任務是否已經執行了:
# cat check-alive.log
ultrahook working ok, pid_cnts = 1, Sat Feb 22 10:40:01 EST 2020
其次,可以查看 crontab 是否處於開啓狀態:
# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 22:06:31 EDT; 8 months 26 days ago
Main PID: 6445 (crond)
Tasks: 1
Memory: 900.0K
CGroup: /system.slice/crond.service
└─6445 /usr/sbin/crond -n
Feb 22 10:25:01 centos-01 crond[6445]: (root) RELOAD (/var/spool/cron/root)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
4. 設置日誌自動輪換
爲了避免日誌長期存儲佔據大量磁盤空間,我們可以基於 logrotate 配置日誌自動輪換
在 /etc/logrotate.d
文件夾下新建一個配置文件(例如命名爲 check-alive
),告訴 logrotate 如何輪換我們的日誌文件
/root/check-alive.log
/root/ultrahook.log
{
rotate 5
size 20M
compress
copytruncate
dateext
}
上述配置的主要意思是:最多保留5份日誌,日誌文件超過 20M 即壓縮存檔,清空前複製日誌文件,存檔文件後綴以日期命名。
可以通過手動執行一次備份,驗證配置是否正確:
# logrotate -vf check-alive
reading config file check-alive
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /root/check-alive.log forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /root/check-alive.log
log needs rotating
rotating log /root/check-alive.log, log->rotateCount is 5
dateext suffix '-20200223'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /root/check-alive.log to /root/check-alive.log-20200223
set default create context to unconfined_u:object_r:admin_home_t:s0
truncating /root/check-alive.log
compressing log with: /bin/gzip
set default create context to unconfined_u:object_r:admin_home_t:s0
set default create context
...