Назад | Перейти на главную страницу

Monit не перезапускает службу

У меня есть сценарий node.js, который я хочу демонизировать в системе Funtoo (я помечен как Gentoo, так как я не думаю, что здесь есть что-то действительно специфичное для Funtoo против Gentoo), и я делаю это с помощью следующего сценария инициализации:

#!/sbin/runscript

depend(){
        need redis
}

start(){
        ebegin "Starting myapp"
        NODE_ENV="prod" start-stop-daemon --start --background --make-pidfile -1 /var/log/myapp.log -2 /var/log/myapp.error --chdir /opt/myapp --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js
        eend $?
}

stop(){
        ebegin "Stopping myapp"
        start-stop-daemon --stop --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js
        eend $?
}

Благодаря этому я могу запускать и останавливать службу с помощью сценария инициализации или rc-service. Затем, чтобы убедиться, что он не отключится в случае ошибки, я использую monit со следующей конфигурацией:

check process myapp with pidfile "/var/run/myapp.pid"
        start program = "/sbin/rc-service myapp start"
        stop program = "/sbin/rc-service myapp stop"
        if failed port 8123 protocol HTTP
                request /myapp.client.js
                with timeout 10 seconds
                then restart

Я вижу, что monit успешно контролирует приложение и определяет, когда оно выходит из строя, поскольку, когда оно вылетает, я получаю следующее заполнение моего журнала:

Apr 24 21:05:35 [monit] 'myapp' trying to restart_
Apr 24 21:05:35 [monit] 'myapp' start: /sbin/rc-service_
Apr 24 21:06:05 [monit] 'myapp' failed to start_

Запуск monit из консоли в подробном режиме не дает ничего более полезного:

'myapp' Error testing process id [30106] -- No such process
'myapp' process is not running
'myapp' trying to restart
'myapp' Error testing process id [30106] -- No such process
'myapp' Error testing process id [30106] -- No such process
'myapp' start: /sbin/rc-service
'myapp' Error testing process id [30106] -- No such process
'myapp' Error testing process id [30106] -- No such process
 * WARNING: myapp has already been started

Кажется, что происходит то, что он никогда не запускает команду остановки, поэтому файл pid все еще существует, поэтому start-stop-daemon не поднимает это. Тем не менее, я не совсем уверен, как изменить это поведение, или если оно у меня неправильно настроено (я использовал Gentoo / Funtoo в течение многих лет, но это мой первый случай написать сценарий инициализации, и я впервые использую Монит).

Итак, вкратце, чего мне не хватает, чтобы monit успешно перезапустил мою службу?

ОБНОВИТЬ:

Ответ @aseq заставил меня немного задуматься, и я не совсем понимаю, почему я не подумал об этом раньше. Просто изменив start program строку в файле конфигурации, чтобы:

start program = "/sbin/rc-service myapp restart"

Заставляет его вести себя так, как ожидалось. Журналы все еще немного сварливые, так как start-stop-daemon жалуется на no matching processes found при попытке остановиться, но он все равно возвращается.

Вы находитесь на правильном пути, и monit не запускает его, потому что файл PID все еще существует.

Я сталкивался с этими проблемами раньше, и решение, которое я использовал, заключалось в создании сценария инициализации для конкретной службы, используя что-то вроде /etc/init.d/skeleton (это на debian) в качестве шаблона (или rc.local), что делает убедитесь, что файл PID создается и удаляется соответствующим образом (с помощью start-stop-daemon и др.).

Я не думаю, что есть другое решение, поскольку monit не занимается удалением или созданием файлов PID. Какой бы сценарий вы ни использовали для запуска и остановки службы, он должен правильно создавать и удалять файлы PID.