Я jave, записанный маленький сценарий удара для выполнения каждые 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
$