實現原理
主要是使用linux提供的crontab機制,定時查詢服務器進程是否存在,如果宕機則執行我們預設的重啓腳本
實現
1. 向crontab添加任務
- crontab -l 查詢當前用戶的任務
- 創建一個文件(server_cron)輸入
* * * * * sleep 10; sh /路徑/server_maintenance.sh
- cronrab server_cron (生效)
2. shell腳本
#! /bin/sh
proc_name="./server" #進程名
proc_num() #查詢進程數量
{
num=$(ps -ef | grep gdms |grep $proc_name | grep -v "grep" | wc -l)
echo $num
return $num
}
proc_num
number=$? #獲取進程數量
if [ $number -eq 0 ] #如果進程數量爲0
then #重新啓動服務器,或者擴展其它內容。
cd /home/liudongwei/workspace/server2.0/dist
nohup ./server &
fi
參考:
https://www.cnblogs.com/leodaxin/p/9222969.html
https://blog.csdn.net/shanzhizi/article/details/8123854
上個版本經過實際應用,發現嚴重的問題:每隔一分鐘就會執行一次腳本,如果有LOG日誌的話,會發現你的磁盤快滿了o(╥﹏╥)o
解決問題:
-
回顧了crontab相關知識
- crontab -l
查詢當前用戶任務 - tail -f /var/log/syslog
查看到執行任務命令之後在日誌中的信息反饋 - crontab -r
刪除當前用戶任務
- crontab -l
-
分析
經過我在網上搜素相關問題,瞭解到有些腳本放在crontab定時器中執行,不會運行(就比如我上文提到的重啓服務腳本),我上個腳本之所以執行成功,是因爲 grep gram,其實我也不知道這是啥意思,我抄的。。。大意是搜索gram,這個哪有,所以函數proc_num() 返回值都是0。 -
解決
- 一行一行的理解代碼
- 驗證測試
- 反正我是試出來的
proc_num()
{
# ps -ef | grep ./server
# echo
# ps -ef | grep ./server | grep -v "grep"
# echo
# ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh"
# echo
# ps -ef | grep $proc_name | grep -v "grep" | wc -l
# echo
# ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh" |wc -l
# echo
num=$(ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh" |wc -l)
# echo $num
return $num
}
總結
拿來,沒有真正理解,會返工,只能多總結,多積累