У меня есть служба Unit-File 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 при проверке состояния, потому что в этом случае будет доступна вся информация и известен соответствующий статус.

2 ответа2

3

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

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

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


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

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

0

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

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.

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