我正在努力寻找一种监控流程的方法。如果进程未运行,则应再次检查以确保它确实已崩溃。如果它真的崩溃了运行脚本(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?
答案 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通过屋顶,这使得很难纠正问题。