linux監控程式-程式自動重啟方法
家在寫server的時候,不管server寫的是多麼健壯,還是經常出現core dump等程式異常退出的,但是一般情況下需要在無人為干預情況下,能夠自動重新啟動,保證server程式能夠服務使用者。這時就需要一個監控程式來實現能夠讓程式自動重新啟動,現在筆者在寫portmap就遇到了這個問題,通過網上查詢資料,找到了一個相對靠譜的exec+fork解決方法。
使用指令碼實現自動重啟
首先想到的最簡單的使用shell指令碼,大概思路:
ps -ef | grep “$1″ | grep -v “grep” | wc –l 是獲取 $1 ($1 代表程序的名字)的程序數,指令碼根據程序數來決定下一步的操作。通過一個死迴圈,每隔 1 秒檢查一次系統中的指定程式的程序數,這裡也可使用crontab來實現。
這種方法比較土,還是可以基本解決問題,但是有1s的延遲,筆者在應用中未採用這種方法,有關這個shell指令碼,請參看文章後面的附件程式碼。
exec+fork方式
筆者最終採用的exec+fork方式來實現的,具體思想如下:
1,exec函式把當前程序替換為一個新的程序,新程序由path或file引數指定。可以使用exec函式將程式的執行從一個程式切換到另一個程式;
2,fork函式是建立一個新的程序,在程序表中建立一個新的表項,而建立者(即父程序)按原來的流程繼續執行,子程序執行自己的控制流程;
3,wait 當fork啟動一個子程序時,子程序就有了它自己的生命週期並將獨立執行,我們可以在父程序中呼叫wait函式讓父程序等待子程序的結束;
相信介紹到這裡,讀者已經能夠想到解決方法了:1)首先使用fork系統呼叫,建立子程序,2)在子程序中使用exec函式,執行需要自動重啟的程式,3) 在父程序中執行wait等待子程序的結束,然後重新建立一個新的子程序。
使用方法:
#./portmap 需要監控的程式的路徑 #args portmap 需要的引數 $ ./supervisor ./portmap args.....
程式碼如下:
/** * * supervisor * * author: liyangguang ([email protected]) * * date: 2011-01-21 21:04:01 * * changes * 1, execl to execv */#include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> int main(int argc, char **argv) { int ret, i, status; char *child_argv[100] = {0}; pid_t pid; if (argc < 2) { fprintf(stderr, "Usage:%s <exe_path> <args...>n", argv[0]); return -1; } for (i = 1; i < argc; ++i) { child_argv[i-1] = (char *)malloc(strlen(argv[i])+1); strncpy(child_argv[i-1], argv[i], strlen(argv[i])); child_argv[i-1][strlen(argv[i])] = '0'; } while(1){ pid = fork(); if (pid == -1) { fprintf(stderr, "fork() error.errno:%d error:%sn", errno, strerror(errno)); break; } if (pid == 0) { ret = execv(child_argv[0], (char **)child_argv); //ret = execl(child_argv[0], "portmap", NULL, 0); if (ret < 0) { fprintf(stderr, "execv ret:%d errno:%d error:%sn", ret, errno, strerror(errno)); continue; } exit(0); } if (pid > 0) { pid = wait(&status); fprintf(stdout, "wait return"); } } return 0; }
shell指令碼方式的程式碼如下:
# 函式: CheckProcess # 功能: 檢查一個程序是否存在 # 引數: $1 --- 要檢查的程序名稱 # 返回: 如果存在返回0, 否則返回1. #------------------------------------------------------------------------------ CheckProcess() { # 檢查輸入的引數是否有效 if [ "$1" = "" ]; then return 1 fi #$PROCESS_NUM獲取指定程序名的數目,為1返回0,表示正常,不為1返回1,表示有錯誤,需要重新啟動 PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l` if [ $PROCESS_NUM -eq 1 ]; then return 0 else return 1 fi } # 檢查test例項是否已經存在 while [ 1 ] ; do CheckProcess "test" CheckQQ_RET=$? if [ $CheckQQ_RET -eq 1 ]; then # 殺死所有test程序,可換任意你需要執行的操作 killall -9 test exec ./test & fi sleep 1 done
相關推薦
linux監控程式-程式自動重啟方法
家在寫server的時候,不管server寫的是多麼健壯,還是經常出現core dump等程式異常退出的,但是一般情況下需要在無人為干預情況下,能夠自動重新啟動,保證server程式能夠服務使用者。這時就需要一個監控程式來實現能夠讓程式自動重新啟動,現在筆者在寫portma
VS2010 MFC Dialog實現程式自動重啟
VS2010 MFC Dialog 做了一個小專案,需要實現自動重啟,搜了一些文章,各有優缺點,所以將這些文章做了一下簡單的綜合,下面是自己的實現過程,並附上了參考文章連結,希望能給新手帶來幫助。 1. 先建一個VS2010 MFC Dialog 工程,此處之所
Qt程式自動重啟的實現
正常退出呼叫exit() 或quit()就行,想要自已重啟可按下面程式碼: void XXX:onRestart() { //類中呼叫 qApp->exit(888); } 主main函式中處理 int main(int argc,
linux下定時自動重啟tomcat伺服器
我們在Linux系統上的tomcat部署了專案之後,可能因為專案存在某些bug等原因會導致過段時間就掛掉,作為臨時解決方案,我們需要間隔一段時間之後就重啟一次伺服器,但是人為重啟又太low太費力,所以自動重啟就略顯高大上牛逼霸氣了~ 下面開始介紹步驟: 1.編輯一個文字檔
Zookeeper / Linux Shell zookeeper自動重啟指令碼
最近博主遇到了 zookeeper 自動死掉的問題, 這裡 留下一個重啟指令碼, 作為備份 #!/bin/bash #zk伺服器問題修復指令碼 #zkServer服務所在路徑 zkDir="/usr/local/zookeeper/bin/" zkLog='zook
arm linux 使用monit監控程式在崩潰後自動重啟它們
在arm linux上有很多程式想實現長期穩定執行,但是很多人寫的程式碼不健壯,偶爾會出現崩潰的問題,需要在崩潰以後能自動重啟,可能有些人使用了shell指令碼做個死迴圈來實現,其實沒必要這麼費勁,使用monit來做就可以,monit主頁是一隻鬥牛犬,大概是看門狗的意思。
Linux-- 簡單的程式守護指令碼,程式異常退出後自動重啟
#!/bin/sh while true do ps -ef | grep "test(程式名)" | grep -v "grep" if ["$?" -eq 0] then ./test echo "wath process has been restarted! "
windows2008設置IIS服務器定時自動重啟的方法
窗口 連接 比較 logs bsp 就會 .cn 朋友 舉例 我們在使用windows2008下IIS服務器時會經常出現資源耗盡的現象,運行一段時間下來就會出現訪問服務器上的網站時提示數據庫連接出錯,重啟IIS後網站又能正常訪問了,這個問題可能困擾了很多站長朋友。青島做網
在windows 上自動重啟 tomcat 的方法
下載 ech num 指定時間 重啟 set restart family blog 在windows 上自動重啟 tomcat 的方法 實現思路: Windows 上監控tomcat 進程並且自動重啟的腳本 一類是 定時重啟 tomcat 一類是 監控並重啟 寫一個守護t
linux kafka程序掛了 自動重啟
使用crontab,定時監控 kafka程序,發現掛了後重啟。 shell指令碼如下: #!/bin/sh source /etc/profile proc_dir="/data/kafka" # 程式目錄 pro
監控伺服器程式,掛掉後自動重啟
1、定時呼叫ps,檢查程式是否活著。如果不在了就啟動程式 #!/bin/bash name=$1 while true do c=`ps -x | grep $name | grep -v grep
使用node-supervisor自動重啟node程式
npm install -g supervisor 還需要把supervisor做一個軟連結到/usr/local/bin/下。 考慮到supervisor跟另一個系統常用的supevisor命令同名容易有衝突,顧只將node-supervisor軟連結過去。 軟連結的命令:
windows server 2012 設定IIS伺服器定時自動重啟的方法
1:首先開啟Windows的任務計劃服務Task Scheduler,如果你沒有關閉該服務的話,預設是開啟的;如果你關閉了該服務,那開啟Task Scheduler服務方法如下:開始→控制面板→管理工具→服務→在右邊的視窗中找到Task Scheduler服務,將其啟動型別設為自動,服務狀態設為開啟即可 2
用Shell指令碼定時監控Linux下的程序狀態並自動重啟
以mysql為例,先上shell指令碼,如下: #!/bin/bash ps -ef | grep mysqld | grep -v grep if [ $? -ne 0 ] then echo “start process…” /etc/rc.d/init.d
Linux下Tomcat實時監控並自動重啟
由於專案時常出現記憶體不足,然後造成服務掛掉,由於公司成本考慮,和戰略轉移,不能在硬體上進行升級,但還要保證服務的穩定執行,因此寫了個shell指令碼來對服務進行實時監控,並在掛掉的情況下實現自動重啟。 指令碼程式碼 注意事項 一、指令碼寫好後要進行命名,一定要
資料庫叢集自動重啟?Linux硬體錯誤日誌立大功!
環境:兩臺某想R680的物理機搭建一套2節點RAC,資料庫版本為ORACLE 11.2.0.4 一、故障問題現象 節點2頻繁發生重啟,從1月至2月發生多次重啟,甚至一天內3次重啟,讓人頭疼。 二、問題分析處理過程 1、檢查是否時間同步問題 首先懷疑是時間不同步造成的。 觀察現象是該伺服器的ntp時
Linux 下python 利用supervisord自動重啟多程序
1、安裝supervisord 利用SecureCRT進入Linux環境,輸入python,進入python shell環境,import supervisor看是否安裝了supervisord,若沒有安裝, yum install python-setuptools
Linux 程序終止後自動重啟
/opt/a.sh #! /bin/bash ps -ef | grep python3 a.py | grep -v grep | grep python3 if [ $? -ne 0 ] then cd /opt/a.py && python3 a.py else echo "runni
linux 程序守護,監控並自動重啟
1、[下載](http://cr.yp.to/daemontools.html daemontools)daemontools安裝包 2、安裝 tar xvzf daemontools-0.76.tar.gz cd admin/daemontools-0.76 package/in
伺服器和電腦無故間隔性自動重啟或宕機 處理 Performance 擴充套件計數器提供程式時,效能登錄檔值中的效能字串被損壞
解決方法是 1.在命令提示符下鍵入:lodctr /r,自動重建效能計數器字串表 (*注意用管理員身份進dos) 效能計數器資訊儲存在以下位置: 2.登錄檔: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Curren