Скрипт, который проверяет и запускает банку, иногда запускает ее дважды.
Я написал небольшой 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 случается редко, например, на моей машине это происходило 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
$