Java-процесс преждевременно перезапускается под runit
Я пытаюсь запустить Logstash под контролем runit. Мой скрипт запуска для Logstash просто
#!/bin/sh
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log
Если я запускаю этот скрипт вручную, потребуется 30 или 45 секунд, чтобы процесс правильно запустился и начал выполнять работу, но впоследствии он будет работать в течение пары часов. Тем не менее, когда я пытаюсь сделать sv start logstash
он выполняет сценарий (и Logstash определенно запускается, потому что я вижу вывод, записанный в /var/log/logstash.log), но через 15 или 20 секунд runit, похоже, убивает и перезапускает процесс Java Logstash.
Я пытался установить -w
вариант, но, похоже, он больше не ждет запуска процесса.
Как я могу правильно запустить runit, чтобы запустить этот процесс Java и перезапустить его только после его смерти?
2 ответа
Это оказалось не проблемой с runit, а с logstash. Тем не менее, я не вижу ошибки, потому что я не ловил вывод из сценария запуска. Изменение команды до конца
2>&1 >> /var/log/logstash_runner.log
Записывает stderr и stdout в файл. Это позволило мне обнаружить настоящую проблему в том, что мне нужно было установить HOME в моем скрипте, чтобы logstash мог найти HOME/.netrc для аутентификации с помощью плагина Heroku.
Сначала установите svlog
, Используя это довольно безболезненно.
Во-вторых, (при условии, что определение службы находится в /etc/sv) измените /etc/sv/logstash/run
сказать:
#!/bin/sh
exec 2&>1
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log
Вы правы в этом stderr
должен быть перенаправлен на stdout
,
Затем сделайте это (адаптируясь к вашей установке по мере необходимости):
mkdir /etc/sv/logstash/log
touch /etc/sv/logstash/log/run
chmod 744 /etc/sv/logstash/log/run
mkdir /var/log/logstash
chown log /var/log/logstash
chmod 775 /var/log/logstash
ln -s /var/log/logstash /etc/sv/logstash/log/main
Это создает запись журнала для службы, устанавливает файл-заглушку для редактирования, создает каталог для хранения файлов журнала и предоставляет символическую ссылку для службы регистрации, на которую следует перенаправлять вывод.
Наконец, поместите это в /etc/sv/logstash/log/run
#!/bin/sh
exec 2>&1
exec svlog -tt main
Перезапустите сервис с помощью sv restart logstash и подождите несколько секунд... и у вас должно быть два процесса в списке, ваш logstash
обслуживание и svlog
работает с этим. Все выход из logstash
будет подаваться в svlog
который, в свою очередь, запишет файл журнала в /etc/sv/logstash/log/main
символическая ссылка, которая в свою очередь падает в /var/log/logstash/current
, Завершение logstash
обслуживание с sv stop logstash
позволит любой окончательный вывод в svlog
который будет записывать на диск перед выходом.