使用腳本檢查某個進程是否在運行,若否,則啟動該進程。
主要思路:根據進程名進行查找(當然如果有兩個名字一樣的進程就不行了),用ps + grep檢查進程是否已經存在,同時要注意用grep -v過濾掉當前腳本的進程(因為該進程的路徑會作為參數傳給這個腳本),還有要過濾掉grep命令產生的子進程(在shell中執行命令時會調用fork產生一個子進程,然后用exec更換進程的映象)
注意重啟進程時直接啟動了一個可執行文件:$process_path &
如果要啟動的是shell腳本的話,可以使用:sh $process_path &
啟動完進程之后可以再檢查一下進程是否已經成功啟動了。
最后,如果再加上crontab,就可以讓腳本定時執行,一旦發現進程沒有運行,則啟動該進程,這樣就實現了進程的自動拉起。
crontab -l #查看你的任務crontab-e#編輯你的任務crontab-r#刪除用戶的crontab的內容
讓腳本每一分鍾運行一次:
*/1 * * * * /home/xxx/proc_monitor.sh /home/xxx/demo &
下面是自動拉起的腳本:
#!/bin/bash # name:proc_monitor.sh # 作用:監控程序,若程序被kill,則自動拉起程序 # 腳本的名字,用以在查找進程時過濾掉當前腳本的進程 script_name="proc_monitor.sh" # 檢查文件是否存在 # @param $1:要監控的程序的目錄 function check_file() { if [ $# -ne 1 ]; then echo "參數錯誤,正確使用方法: check_file /dir/file" return 1; fi if [ ! -f $1 ];then echo "文件 $1 不存在" return 1 fi } # return 0:進程沒有運行 1:進程已運行 # @param $1:要監控的程序的目錄 function monitor_process() { if [ $# -ne 1 ]; then echo "參數錯誤,正確使用方法:monitor_process /dir/file" return 1 fi process_exists=$(ps -ef | grep $1 | grep -v grep | grep -v $script_name | wc -l) if [ $process_exists -eq 0 ]; then return 0 else return 1 fi } # 啟動監控程序 # @param $1:要監控的程序的目錄function start_monitor() { if [ $# -ne 1 ]; then echo "參數錯誤,正確使用方法:start_monitor /dir/file" return 1 fi process_path=$1 process_name=$(echo $process_path | awk -F / '{print $NF}') monitor_process $process_name if [ $? -eq 0 ]; then echo "該進程沒有運行:$process_path" echo "現將啟動進程" $process_path & #sh $process_path & monitor_process $process_name if [ $? -eq 1 ]; then echo "重啟進程成功" else echo "重啟進程失敗" fi else echo "進程已經啟動" fi } # 主程序 # @param $1:要監控的程序的目錄 if [ $# -ne 1 ]; then echo "參數錯誤,正確使用方法:ecdata_proc_monitor /dir/file" exit 1 fi check_file $1 if [ $? -ne 0 ]; then exit 1 fi start_monitor $1