1

У меня есть VPS с некоторыми приложениями Java (сделанные с "Play Framework"), работающие на портах 9000, 9001, 9002 и 9003. VPS Provider (iPage) время от времени неожиданно перезагружает серверы, оставляя все четыре процесса недоступными.

Запускаемые мной процессы запускаются

  • nohup ./start -Dhttp.port=9000 ,
  • nohup ./start -Dhttp.port=9001 ,
  • nohup ./start -Dhttp.port=9002 и
  • nohup ./start -Dhttp.port=9003

со всеми четырьмя start пусковыми программами, созданными "Play" и расположенными в разных папках (внутри /opt).

Каждый раз, когда iPage перезагружает мой VPS, все четыре папки сохраняют свой файл «RUNNING_PID» со своим прежним PID, поэтому я должен вручную удалить эти файлы, чтобы иметь возможность снова их скопировать.

Я проверял этот ответ на относительно похожий вопрос (как мне написать bash-скрипт для перезапуска процесса, если он умирает?) (без указания порта и стиля nohup , я думаю) без успеха.

Это то, что я сделал до сих пор:

  • Сделал файл tryReboot (сохраненный в /opt/myJavaApp9000/) со следующим содержимым:

    until start -Dhttp.port=9000; do
        echo "9000 process crashed with exit code $?.  Respawning.." >&2
        sleep 1
    done
    
  • Добавлен @reboot /opt/myJavaApp9000/tryReboot в файл crontab с помощью crontab -e

После перезагрузки сервера (через iPage Reboot) все четверо сохранили свои файлы RUNNING_PID , но ни один из них не был перезапущен. В чем может быть проблема?

2 ответа2

0

Рассмотрите возможность использования monit. Он разработан специально для этой задачи. Нет необходимости заново изобретать колесо.

просто отредактируйте /etc /monit /monitrc, добавьте путь к вашему сценарию, и все готово.

0

В чем может быть проблема?  Вот несколько возможностей:

  • Перечитайте ответ, на который вы ссылались.  until [start -Dhttp.port=9000]; do не должно быть скобок [ и ] .
  • Если у вас есть . (текущий каталог) в вашем пути поиска, вам не нужно говорить ./ когда вы запускаете свою start программу так, как вы это делаете сейчас.  Если у вас нет . в пути поиска, вы должны сказать ./start в вашем tryReboot сценарии.
  • Ваш скрипт tryReboot может не запускаться из crontab по ряду причин.  Например, рискуя оскорбить ваш интеллект, вы не говорите, что сделали chmod +x tryReboot .  Вы убедились, что tryReboot работает?  Возможно, записав сообщения в лог-файл?  Подсказка: вы можете включить дату и время в эти сообщения, добавив $(date) в вашу строку echo .
  • Файлы RUNNING_PID могут сохраняться, потому что нет механизма их удаления.  (Если вы сказали, как вы ожидаете, что они будут удалены, я пропустил это.)  Вам, вероятно, следует удалить файл RUNNING_PID в начале сценария tryReboot ; и, действительно, вероятно, в каждой итерации (потому что, если вы доберетесь до оператора echo , это означает, что команда start завершилась).

Но это трудно сказать , что это проблема, потому что ваш вопрос немного неясно.

  • Является ли start название вашей программы, и вы действительно запуская его с помощью команды nohup ./start -Dhttp.port=port_number & или start программу , которая разветвляется и запускает программу в асинхронном дочернем процессе?  Если последний, то весь до командования ; подход until command; do … done неуместен.
  • Вы пробовали запустить tryReboot вручную?  Что просходит?

И т.п.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .