Сценарий, который проверяет и выполняет банку, иногда выполняет ее дважды.

Я 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                                                                           
0
задан 27 October 2014 в 21:54
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 случается редко, например на моей машине это произошло 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
$
1
ответ дан 4 December 2019 в 17:08

Теги

Похожие вопросы