![](/img/trans.png)
[英]before executing script.sh, Check script.sh running or not, if its running kill and continue
[英]Check if process runs if not execute script.sh
我試圖找到一種監控過程的方法。 如果該進程未運行,則應再次檢查以確保它確實崩潰了。 如果確實崩潰,請運行腳本(start.sh)
我嘗試了不成功的監控,也嘗試了在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?
不客氣,但您是否考慮過更明顯的解決方案?
當外殼程序(例如bash或tcsh)啟動子進程時,默認情況下它將等待該子進程完成。
那么,為什么沒有在while(1)循環中運行您的進程的shell? 每當該進程由於某種原因(無論合法與否)終止時,它將自動重新啟動您的進程。
我在mythtv中遇到了同樣的問題。 后端一直崩潰在我身上。 這是一個Heisenbug。 每月發生一次(平均)。 很難追蹤。 所以我只寫了一個在xterm中運行的小腳本。
嗯 , oninter業務意味着control-c將終止子進程,而不是我的(父進程)腳本。 同樣,睡眠在那里,所以我可以多次控制-c殺死子進程,然后在睡眠時殺死父進程腳本...
Coredumpsize受到限制是因為我不想用無法使用的corefile填充磁盤。
#!/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
ps如果子進程立即死亡,那么睡眠也可以為您節省時間。 否則,不斷重生而不會造成延遲,將使您的IO和CPU癱瘓,從而難以糾正問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.