systemd не обнаруживает мертвый процесс демона

systemd не обнаруживает мертвый процесс демона

У меня есть aaa.serviceфайл (управляющий JBoss), который помимо других обычных вещей содержит

[Service]
Type=forking
ExecStart=/my/script start
ExecReload=/my/script restart
ExecStop=/my/script stop
PIDFile=...

/my/script startсоздает PID-файл и service aaa statusпоказывает его, выдавая странное предупреждение:

Supervising process xxx which is not our child. We'll most likely not notice when it exits.

Полный вывод:

   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 34min ago
  Process: 32435 ExecStart=/my/script start (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service

Jan 22 20:54:56 I011-830 su[32447]: (to aaa) root on none
Jan 22 20:54:56 I011-830 su[32447]: pam_unix(su-l:session): session opened for user aaa by (uid=0)
Jan 22 20:55:16 I011-830 aaa[32435]: Starting JBoss application server: Starting JBoss application server:
Jan 22 20:55:16 I011-830 systemd[1]: aaa.service: Supervising process 32542 which is not our child. We'll most likely not notice when it exits.

Теперь моя реальная проблема в том, что если процесс убивается не выдачей service aaa stop, systemd его не обнаруживает. Более того, он утверждает, что он запущен и не хочет его запускать снова:

# cat <pid-file>
No such file or directory
# service aaa status
   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 40min ago
  Process: 32435 ExecStart=/konsens/app/aaa/init/aaastart (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service
 ...
# service aaa start
# <--- Instant return, no process started

Как мне достичь следующих целей?

  • systemd должен иметь возможность запускать и останавливать мою службу
  • service aaa statusдолжен отображать состояние процесса независимо от того, был ли он запущен systemd или вручную./my/service start
  • systemd должен иметь возможность запускать службу после того, как она была остановлена ​​вручную
  • systemd должен иметь возможность останавливать службу, которую я запустил вручную

решение1

Как мне достичь следующих целей? 1 systemd должен иметь возможность запускать и останавливать мою службу

Большинство дистрибутивов имеют обратную совместимость, поэтому вы можете сохранить свою службу в /etc/init.d/, если вы не хотите создавать собственную службу.

2 service aaa status должен отображать состояние процесса независимо от того, был ли он запущен systemd или вручную с помощью команды /my/service start

Один из способов сделать это — добавить в свой скрипт проверку, которая будет вызываться, systemctl start aaa.serviceесли он не был вызван изначально. Для выхода можно использовать ловушку.

3 systemd должен иметь возможность запускать службу после того, как она была остановлена ​​вручную

решено #2

4 systemd должен иметь возможность останавливать службу, которую я запустил вручную

решено #2

Связанный контент