
У меня есть 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