Systemd: контролирующий процесс XXXX, который не является нашим ребенком. Скорее всего, мы не заметим, когда он выйдет

Я создал специальный файл службы, который выглядит следующим образом:

cat /etc/systemd/system/aaa.service

[Unit]
Description=aaa main application
After=syslog.target network-online.target

[Service]
Type=forking
PIDFile=/usr/local/aaa_path/aaa/aaa.pid
WorkingDirectory=/usr/local/aaa_path/aaa/
ExecStart=/usr/local/aaa_path/aaa/run_aaa.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

При проверке статуса с помощью:

systemctl status aaa

Все выглядит хорошо, за исключением:

... systemd[1]: aaa.service: Supervising process 18285 which is not our child. We'll most likely not notice when it exits.

Хотите знать, почему это сообщение показывает, и если это что-то беспокоить?

мой ExecStart - это bash-скрипт с именем run_aaa.sh; Он подготавливает некоторые переменные среды, запускает некоторые необходимые сценарии сопровождения и, наконец, запускает двоичный файл aaa (как демон) с некоторыми параметрами динамической командной строки в фоновом режиме - и завершает работу (завершается сценарий run_aaa.sh, демон aaa). бинарный файл работает в фоновом режиме и поддерживает свой собственный pid-файл, о котором знает systemd)

Я знаю, что systemd запускает run_aaa.sh и ожидает его разветвления (потому что я указал type = forking), и он на самом деле "разветвляется", запустив двоичный демон "aaa" в фоновом режиме и выйдя после него. Кроме того, я указываю путь PIDFile, и мой двоичный файл aaa поддерживает этот PIDFile так, как должен, так почему бы systemd пожаловался, что он может не контролировать мой демон?

Есть ли лучший способ настроить службу для этого варианта использования? (Я должен использовать скрипт run_aaa.sh, чтобы выполнить мой бинарный файл)

1 ответ

Если вам нужно запустить скрипт оболочки только один раз, просто добавьте ExecStartPre=/path/to/script и запусти своего демона с ExecStart=/path/to/daemon, Сценарий не будет запускаться при перезагрузке, возможно, это не то, что вам нужно.

Если вам нужно запустить скрипт и при перезагрузке, то установите Type=simple и запустите демон в режиме переднего плана из сценария оболочки, чтобы сценарий не завершился. Но вы все еще получаете это сообщение, и действия остановки / перезапуска ждут 30 секунд, прежде чем State 'stop-sigterm' timed out. Killing, очень неприятный. Если вы добавите ExecStop=/bin/kill $MAINPID, проблема тайм-аута уходит. Не удаляйте PIDFile, Вы по-прежнему будете видеть это сообщение, но каждое действие start/stop/restart/status работает правильно. Возможно есть другой лучший способ достигнуть того же самого. По крайней мере, это работает для меня, и сообщение может быть безопасно проигнорировано. Когда демон выходит, сценарий оболочки также завершает работу, поэтому systemd будет это знать.

Другие вопросы по тегам