надежный способ обнаружения процесса java

У меня есть javaпроцесс, который постоянно работает, что иногда, по причинам, которые мне еще предстоит полностью отладить, дерьмо. Итак, у меня также есть задание cron, которое ищет процесс каждые 5 минут, и если он обнаружит, что процесс не запущен, он вызывает скрипт для его перезапуска.

Иногда возникает проблема, когда скрипт проверки получает ложный отрицательный результат – он считает, что процесс не работает, когда на самом деле это так. Я не видел никакой согласованности, когда он это делает. Но мне нужен совершенно надежный способ проверить, работает ли этот процесс.

Сейчас я занимаюсь этим:

if ! pgrep -f '/path/to/XML2DB.jar -n' > /dev/null then nice -n 19 java -Xmx2024M -jar /path/to/XML2DB.jar -n > /dev/null 2>/dev/null & echo "" | mail -s "$HOST: xml2db was found not running, is being started" support@mycompany.com fi 

До pgrep мы использовали ! ps ax | grep -v grep | grep "XML2DB.jar -n" > /dev/null ! ps ax | grep -v grep | grep "XML2DB.jar -n" > /dev/null ! ps ax | grep -v grep | grep "XML2DB.jar -n" > /dev/null но это также давало ложные срабатывания.

Версия Linux – это версия для Scientific Linux SL release 3.0.9 (SL) и LSB Version 1.3.

Заранее спасибо!

  • Задача Cron для выполнения файлов jar файлов по рабочим дням по местному времени с 8 до 17 часов, без выходных
  • Не удается установить веб-приложение Java на Fedora
  • Я установил java, и он работает, но когда я пытаюсь вернуть Java домой, он пуст
  • Как развернуть приложение Java
  • Может подключаться от RPi к ноутбуку, но не наоборот
  • Процесс Java зависает, пока я не использую 100% CPU
  • Запустить банку при запуске во всех системах на основе * nix
  • любая функция на linux, например Perfermance Counter на серверах Windows?
  • 2 Solutions collect form web for “надежный способ обнаружения процесса java”

    Невозможно надежно и полезно проверить, что работает несвязанный процесс: всегда возможно условие гонки. Даже если вы обнаружите способ определить, запущен ли процесс, который вас интересует, он может быть убит сразу же после его просмотра или, наоборот, может начаться сразу после его промаха.

    Если вы контролируете программу или способ ее запуска, вы можете зарезервировать уникальный ресурс, такой как блокировка файла. Однако, если вы контролируете способ запуска программы, есть более простой способ отслеживать ее: контролировать ее из своего родителя. Процесс сообщается, когда его ребенок умирает.

    Самый простой способ гарантировать, что процесс всегда выполняется, – это перезапустить его в цикле.

     # sleep 1 avoids a tight loop if the process systematically fails to start while sleep 1; do nice … ret=$? if [ $ret -le 127 ]; then msg="… exited with status $ret" else msg="… exited on signal $((ret-128))" esac mail -s "$msg" "$USER" done 

    Существует более надежное и более мощное программное обеспечение для мониторинга. См. Как настроить надлежащий мониторинг моих услуг автоматическим способом? Так что, если один из них сработает автоматически на лету?

    ps ax | grep -v grep | grep "XML2DB.jar -n" ps ax | grep -v grep | grep "XML2DB.jar -n" ps ax | grep -v grep | grep "XML2DB.jar -n" есть условие гонки: экземпляры grep могут или не могут начаться вовремя, чтобы ps мог их видеть, поэтому вы получаете неточные подсчеты: см. здесь и здесь . Вы не первый, кто попал в беду, используя его.

    Я сделал strace pgrep somepattern в поле RHEL, чтобы узнать, что делает pgrep . Он записывает каждый каталог процесса в /proc и открывает /proc/<PID>/cmdline для некоторых PID и читает содержимое, предположительно, для соответствия шаблону, указанному в командной строке pgrep . Я размахиваю руками, но, готов поспорить, там есть состояние гонки.

    Единственное надежное решение для этого – заставить процесс Java попытаться создать « каталог блокировки ». Создание каталогов является атомарным для пользовательских процессов. Если каталог блокировки уже существует, выйдите с сообщением об ошибке, другим способом. запускать. После создания каталога блокировки он должен записать свой PID в файл в каталоге блокировки.

    Вы можете использовать PID в файле, чтобы проверить, запущена ли программа Java с kill -0 $(cat /whatever/lockdir/PIDfile) – если процесс не существует, kill завершит работу с ненулевым статусом.

    Хитрость заключается в передаче PID в программу Java в командной строке:

     exec java blah blah -mypid $$ 

    Вы все равно должны быть очень осторожны в отношении ошибок или исключений, связанных с созданием каталога блокировки, а также при интерпретации kill -0 и при удалении файла PID и каталога блокировки, но у вас будут проблемы с любым другим методом.

    Linux и Unix - лучшая ОС в мире.