2014-11-24 99 views
0

我想找到一種方法來監視進程。如果進程沒有運行,應該再次檢查以確保它確實崩潰。如果真的應聲運行的腳本(start.sh)檢查進程是否運行,如果不執行script.sh

我曾嘗試的monit沒有更迭,我也試圖在crontab中添加此腳本:我做到了可執行使用chmod + X monitor.sh

實際程序被稱爲program1

case "$(pidof program | wc -w)" in 

0) echo "Restarting program1:  $(date)" >> /var/log/program1_log.txt 
/home/user/files/start.sh & 
;; 
1) # all ok 
;; 
*) echo "Removed double program1: $(date)" >> /var/log/program1_log.txt 
kill $(pidof program1 | awk '{print $1}') 
;; 
esac 

問題是這個腳本不起作用,我將它添加到crontab並將它設置爲每2分鐘運行一次。如果我關閉該程序,它將不會重新啓動。

是否有任何其他方式來檢查進程,並在崩潰時運行start.sh?

+0

是的,要做到這一點的方法是使用像monit這樣的監控工具或其他十幾種這樣的工具。如果你不能使用它(並且不想向**尋求幫助,那麼這個腳本如何不起作用?腳本是做什麼的? – 2014-11-24 19:08:34

+2

運行'supervisor'或類似的東西,沒有理由以重建輪/ NIH綜合徵 – Wrikken 2014-11-24 19:08:35

+0

一個可能的直接答案是將nohup命令放在命令前面以運行該腳本:nohup /home/user/files/start.sh& - 其他海報是正確的,有很好的方法去做你想做的事。 – 2014-11-24 20:53:16

回答

0

不要粗魯,但你有沒有考慮過更明顯的解決方案?

當shell(例如bash或tcsh)啓動子進程時,默認情況下它會等待該子進程完成。

那麼爲什麼不有一個shell在while(1)循環中運行你的進程呢?只要進程終止,出於任何原因,合法與否,它都會自動重啓您的進程。

我遇到了與mythtv相同的問題。後端不停地撞向我。這是一隻海森蟲。每月發生一次(平均)。很難追查。所以我只寫了一個我在xterm中運行的腳本。

的,啊,oninter業務是指控制-C將終止該子進程,而不是我的(父進程)的腳本。同樣,睡眠是在那裏,所以我可以控制-C幾次殺子,然後殺掉父進程腳本的時候,它正在睡覺......

Coredumpsize是有限的,只是因爲我不想填補我的磁盤與我無法使用的核心文件。

#!/bin/tcsh -f 

limit coredumpsize 0 

while(1) 

    echo "`date`: Running mythtv-backend" 

     # Now we cannot control-c this (tcsh) process... 
    onintr - 

     # This will let /bin/ls directory-sort my logfiles based on day & time. 
     # It also keeps the logfile names pretty unique. 
    mythbackend |& tee /....../mythbackend.log.`date "+%Y.%m.%d.%H.%M.%S"` 

     # Now we can control-c this (tcsh) process. 
    onintr 

    echo "`date`: mythtv-backend exited. Sleeping for 30 seconds, then restarting..." 
    sleep 30 

end 

p.s.如果你的子進程立即死亡,那麼睡眠也會爲你節省。否則,不斷延遲的重新生成將驅動您的IO和CPU通過屋頂,使得難以糾正問題。

相關問題