检查并运行jar的脚本有时运行两次。

我写了一个小的bash脚本,每隔10分钟运行一次,检查某个程序是否正在运行,是否运行。 但是,我注意到,有时我有两个相同的程序运行的实例(使用ps ax | grep "gateway" )。 我究竟做错了什么?

 #! /bin/bash case "$(ps ax | grep -c gateway.jar)" in 1) echo "Restarting Java Gateway (1): $(date)" >> /home/user/gateway.log java -jar /home/user/project/unx/java/gateway.jar & ;; 0) echo "Restarting Java Gateway (0): $(date)" >> /home/iwidgetuser/gateway.log java -jar /home/user/project/unx/java/gateway.jar & ;; *) echo "Gateway is running! Good!: $(date)" >> /home/user/gateway.log ;; esac 

您的支票正在运行程序是不正确的。

您可以获得正在运行的进程列表,并在程序名称( gateway.jar )中searchstring。 如果string发生在进程列表0或1次启动gateway.jar

如果gateway.jar仍在运行,它将在进程列表中。 而且,如果在进程列表中捕获到grep调用,则它的命令将包含gateway.jar ,并且将由grep计数。

所以有三种情况:

  1. gateway.jar正在运行, grep正在处理列表 – > grep返回2

  2. gateway.jar正在运行,并且grep不在进程列表中 – > grep返回1

  3. gateway.jar没有运行, grep正在进程列表 – > grep返回1

  4. gateway.jar没有运行, grep不在进程列表中 – > grep返回0

如果情况2发生,你的代码第二次启动gateway.jar

情况2很less发生,例如在我的机器上,1000次调用中发生了4次:

 $ for i in `seq 1 1000`; do if [ $(ps ax | grep -c abcd) != "1" ]; then echo $i; fi; done 183 377 632 898 $