Я написал небольшой сценарий 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
). Если строка встречается в списке процессов 0 или 1 раз, когда вы запускаете gateway.jar
.
Если gateway.jar
все еще работает, он будет в списке процессов. Кроме того, если grep
вызов был пойман в списке процессов, его команда будет содержать gateway.jar
и это будет засчитано grep
.
Итак, есть три четырех случая:
gateway.jar
работает и grep
находится в списке обработки -> grep
возвращает 2
gateway.jar
работает и grep
не в списке процессов -> grep
возвращает 1
gateway.jar
не работает и grep
находится в списке обработки -> grep
возвращает 1
gateway.jar
не работает и grep
не в списке процессов -> grep
возвращает 0
Если произойдет случай 2, ваш код запускается gateway.jar
второй раз.
Случай 2 случается редко, например на моей машине это произошло 4 раза из 1000 вызовов:
$ for i in `seq 1 1000`; do if [ $(ps ax | grep -c abcd) != "1" ]; then echo $i; fi; done
183
377
632
898
$