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

检查并运行 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                                                                           

答案1

您检查的程序是否正在运行是错误的。

您获取正在运行的进程列表,并在其中搜索包含程序名称的字符串 ( gateway.jar)。如果字符串在进程列表中出现 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 很少发生,例如在我的计算机上,每 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
$

相关内容