我编写了一个小型 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
。
因此有三四种情况:
gateway.jar
正在运行并且grep
位于进程列表中 ->grep
返回 2gateway.jar
正在运行并且grep
不在进程列表中 ->grep
返回 1gateway.jar
未运行且grep
在进程列表中 ->grep
返回 1gateway.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
$