我有一个python脚本,将检查一个队列,并在每个项目上执行一个动作:

# checkqueue.py
while True:
  check_queue()
  do_something()

我如何编写一个bash脚本来检查它是否正在运行,如果没有,就启动它。大致如下伪代码(或者它应该做一些类似ps | grep?):

# keepalivescript.sh
if processidfile exists:
  if processid is running:
     exit, all ok

run checkqueue.py
write processid to processidfile

我将从crontab中调用它:

# crontab
*/5 * * * * /path/to/keepalivescript.sh

当前回答

您应该使用monit,这是一个标准的unix工具,可以监视系统上的不同内容并做出相应的反应。

来自文档:http://mmonit.com/monit/documentation/monit.html#pid_testing

check process checkqueue.py with pidfile /var/run/checkqueue.pid
       if changed pid then exec "checkqueue_restart.sh"

您还可以配置monit在它重新启动时给您发送电子邮件。

其他回答

我已经在许多服务器上成功地使用了以下脚本:

pid=`jps -v | grep $INSTALLATION | awk '{print $1}'`
echo $INSTALLATION found at PID $pid 
while [ -e /proc/$pid ]; do sleep 0.1; done

注:

它在找java进程,所以我 可以用jps,这样多吗 分布之间的一致性比 ps $INSTALLATION包含了足够的进程路径,这是完全明确的 在等待进程死亡时使用sleep,避免占用资源:)

这个脚本实际上用于关闭一个正在运行的tomcat实例,我希望在命令行中关闭(并等待)它,因此对我来说,不能将它作为子进程启动。

在线:

while true; do <your-bash-snippet> && break; done

如果失败,它将持续重新启动<your-bash-snippet>: && break将停止循环,如果<your-bash-snippet>优雅地停止(返回代码0)。

在所有情况下重启<your-bash-snippet>:

while true; do <your-bash-snippet>; done

例如# 1

while true; do openconnect x.x.x.x:xxxx && break; done

例如# 2

while true; do docker logs -f container-name; sleep 2; done

看看monit (http://mmonit.com/monit/)。它可以处理脚本的启动、停止和重新启动,并且可以执行健康检查,必要时还可以重新启动。

或者做一个简单的脚本:

while true
do
/your/script
sleep 1
done
if ! test -f $PIDFILE || ! psgrep `cat $PIDFILE`; then
    restart_process
    # Write PIDFILE
    echo $! >$PIDFILE
fi

我把它用于我的npm进程

#!/bin/bash
for (( ; ; ))
do
date +"%T"
echo Start Process
cd /toFolder
sudo process
date +"%T"
echo Crash
sleep 1
done