Вопрос или проблема
Моя служба внезапно перестала работать, systemctl status
сообщает:
Главный PID: 5459 (код=убит, сигнал=TERM)
Кроме того, я проверил через journald
для моей службы (journalctl -u myservice.service
), и последняя запись:
<...>
systemd[1]: Остановлена служба MyService.
Означает ли это, что она была остановлена вручную с помощью systemctl stop
, или это может означать, что она аварийно завершилась? Есть ли способ это выяснить?
У меня такая же проблема на ubuntu 18.04 с rails 5.0.1 и ruby 2.3.3: запуск моего сервера из командной строки или через systemd приводит к одинаковому выводу:
$ /usr/local/bin/ruby bin/rails server -b0.0.0.0 -p 3000 -e production
=> Загрузка Thin
=> Приложение Rails 5.0.1 запускается в производственном режиме на http://0.0.0.0:3000
=> Запустите `rails server -h` для получения дополнительных параметров запуска
[2022-06-21 12:55:32] INFO -- Веб-сервер Thin (v1.8.1 кодовое имя Infinite Smoothie)
[2022-06-21 12:55:32] INFO -- Максимальное количество соединений установлено на 1024
[2022-06-21 12:55:32] INFO -- Слушаем на 0.0.0.0:3000, CTRL+C для остановки
Выход
Я вижу этот вывод в консоли, если запускаю сервер из консоли или в journalctl, если запускаю его через systemd, в то время как systemctl status
сообщает Главный PID: 19315 (код=убит, сигнал=TERM)
, как отмечает автор вопроса.
Еще одно странное наблюдение: если я запускаю сервер из командной строки с помощью -d (работа в фоновом режиме), то он работает как следует:
/usr/local/bin/rails server -b0.0.0.0 -p 3000 -e production -d
Работает правильно!
В файле службы systemd ничего не изменилось, и в самом коде сервера было немного значительных изменений. Это может быть проблемой среды, так как я столкнулся с проблемами gem, пытаясь настроить сервер. Однако это действительно не объясняет ситуацию с -d.
Ответ или решение
Проблема с остановкой службы в systemd с кодом =killed
Описание проблемы
Вы столкнулись с ситуацией, когда ваша служба, управляемая systemd, неожиданно остановилась, и команда systemctl status
возвращает следующее сообщение:
Main PID: 5459 (code=killed, signal=TERM)
Кроме того, просмотр журнала с помощью journalctl -u myservice.service
показывает запись:
systemd[1]: Stopped MyService Service.
Анализ сообщения
Символы code=killed, signal=TERM
указывают на то, что процесс вашей службы был завершен с помощью сигнала SIGTERM
. Этот сигнал часто используется для аккуратной остановки процессов. При этом надо учесть, что такая остановка может быть выполнена как вручную, так и автоматически системой или каким-либо другим процессом.
-
Сигнал TERM:
SIGTERM
(сигнал 15) — это стандартный сигнал для запроса завершения процесса. Если ваш процесс получает этот сигнал, он должен завершить работу, освобождая ресурсы и завершая свои операции.- Если бы процесс завершился аварийно (например, из-за ошибки или исключения), вы бы увидели сообщение, аналогичное
code=exited, status=XXX
, где XXX — это код завершения.
-
Завершение вручную или аварийное:
- Вы можете выяснить, кто и почему отправил сигнал
TERM
, проверяя другие записи в журнале системного журнала ({journalctl}) в момент, предшествующий остановке службы. Возможно, у вас есть другие службы или события (например,OOM Killer
— OOM — out of memory), которые могли инициализировать остановку.
- Вы можете выяснить, кто и почему отправил сигнал
Возможные причины
-
Проблемы с ресурсами:
- Если ваша система испытывает нехватку памяти, Linux может автоматически завершать процессы для освобождения ресурсов. Посмотрите на сообщения OOM Killer с помощью
dmesg
или проанализируйте журналы системы (например,/var/log/syslog
илиjournalctl -k
).
- Если ваша система испытывает нехватку памяти, Linux может автоматически завершать процессы для освобождения ресурсов. Посмотрите на сообщения OOM Killer с помощью
-
Изменение конфигурации:
- Если изменялась конфигурация системы или самой службы (особенно в контексте управления зависимостями Ruby и gem’ами), это могло повлиять на работу вашего приложения.
-
Отличия в запуске:
- Запуск программы с ключом
-d
в командной строке создает процесс в фоновом режиме. Еслиsystemd
не удается корректно инициализировать службу для непрерывного выполнения, возможно, будут проблемы с окружением процесса или способами запуска.
- Запуск программы с ключом
Рекомендации по устранению проблемы
-
Проверка журналов:
- Используйте команду
journalctl -xe
для анализа событий, предшествующих остановке, чтобы выяснить, не было ли других сигналов о завершении, ошибок или ресурсов, которые могли повлиять на вашу службу.
- Используйте команду
-
Мониторинг ресурсов:
- Запустите мониторинг системы, чтобы отслеживать использование памяти и ресурсов. Убедитесь, что у вашего приложения достаточно ресурсов для работы.
-
Проверка конфигурации сервиса:
- Убедитесь, что конфигурация вашего systemd-сервиса (
myservice.service
) правильно настроена, особенно секции[Service]
,ExecStart
, иRestart
.
- Убедитесь, что конфигурация вашего systemd-сервиса (
-
Окружение и зависимости:
- Проверьте, не возникла ли проблема с gem’ами или другими зависимостями, которые могли повлиять на запуск вашего сервиса. Если были изменения, попробуйте откатить к прошлой рабочей версии.
-
Логи Rails:
- Также посмотрите логи вашего приложения Rails, чтобы выяснить, не произошло ли ошибок во время обработки запросов.
Заключение
Если у вас остались вопросы или если разрешение проблемы требует дополнительного вмешательства, рассмотрите возможность поднять проблему на платформе поддержки вашего дистрибутива или обратиться к сообществу разработчиков для получения более специализированной помощи.