Как сообщить systemctl, что сервис уже запущен

665
Wernfried Domscheit

У меня есть сервисный файл модуля, mediation.serviceподобный этому:

[Unit] Description=Mobile-IP Log dumper  [Service] Type=forking ExecStart=/opt/mediation/mediation start ExecStopPost=/opt/mediation/mediation stop ExecReload=/opt/mediation/mediation reload PIDFile=/var/lib/mediation/syslog-ng.pid 

Теперь предположим, что кто-то запускает службу напрямую, /opt/mediation/mediation startа не с помощьюsystemctl start mediation

В этом случае systemctl status mediationпокажет:

● mediation.service - Mobile-IP Log dumper Loaded: loaded (/etc/systemd/system/mediation.service; enabled; vendor preset: disabled) Active: inactive (dead) since Mon 2016-07-11 11:24:11 CEST; 8s ago Process: 14088 ExecStopPost=/opt/mediation/mediation stop (code=exited, status=0/SUCCESS) Process: 13482 ExecStart=/opt/mediation/mediation start (code=exited, status=0/SUCCESS) Main PID: 13746 

Возможно ли, что systemctl status mediationпоказывает правильный статус (то есть работает) службы? Похоже, systemctl не перезагружает PIDFile при проверке состояния, потому что в этом случае будет доступна вся информация и известен соответствующий статус.

0
Mobile-IP? Это все еще работает в настоящее время, и как я могу заставить это работать grawity 7 лет назад 0
«Mobile-IP» - это только наше внутреннее название приложения. Он не связан с протоколом Mobile-IP - возможно, название не очень умное, но сейчас уже слишком поздно его менять. Wernfried Domscheit 7 лет назад 0

2 ответа на вопрос

2
grawity

Нет, ты не можешь этого сделать.

Отслеживание службы systemd в основном основано на cgroups, поэтому этот процесс нельзя считать частью, mediation.serviceесли он не входит в соответствующую cgroup. (Например, именно так пользовательские логины отрываются от sshd.service: переходя в другую группу.) Он не заботится о файлах PID, хотя и использует их для дополнительной проверки.

Но даже если процесс вручную перемещен в правильную группу (через / sys / fs / cgroup / systemd), весь сервис все равно не будет считаться «активным», если он не был запущен через systemd.


В Debian и других дистрибутивах, в которых все еще есть набор /etc/init.dсценариев, это решается путем редактирования общего сценария "LSB functions", чтобы автоматически перезапустить initscript через systemctl, если он вызывается вручную.

Но что касается непосредственного запуска демонов ... ну, не думаю ли я, что? Или создайте аналогичный скрипт-обертку, который также перенаправляет запуск вручную в systemctl.

0
Wernfried Domscheit

Поскольку прямого решения не существует, обходным решением может быть добавление таких строк в сценарий.

if [[ ! `ps --no-headers -o args -p $PPID | grep systemd` ]] ; then  echo "You must start the application with 'systemctl start mediation'" exit 1 fi 

Это предотвращает запуск службы за пределами systemctl.

Похожие вопросы