如果不执行script.sh,请检查进程是否运行

时间:2014-11-24 18:39:57

标签: linux bash shell

我正在努力寻找一种监控流程的方法。如果进程未运行,则应再次检查以确保它确实已崩溃。如果它真的崩溃了运行脚本(start.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?

1 个答案:

答案 0 :(得分:0)

不要太粗鲁,但你考虑过一个更明显的解决方案吗?

当shell(例如bash或tcsh)启动子进程时,默认情况下等待该子进程完成。

那么为什么没有一个shell在while(1)循环中运行你的进程呢?无论何时进程因任何原因终止,无论合法与否,它都会自动重启您的进程。

我遇到了与mythtv相同的问题。后端不断撞击我。它是Heisenbug。每个月发生一次(平均而言)。很难追查。所以我只写了一个我在xterm中运行的小脚本。

啊, oninter 业务意味着control-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通过屋顶,这使得很难纠正问题。