2014-11-24 98 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通过屋顶,使得难以纠正问题。

相关问题