使用 crontab 進行程序保活

背景

爲了保證系統運行可靠,有時候需要對程序進行監測,當程序異常掛掉的時候能夠自動快速拉起。在一些對時效性要求不那麼高的場景下,使用 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
...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章