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 для выполнения моего двоичного файла)

5
задан 23 August 2017 в 11:11
1 ответ

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

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

0
ответ дан 3 December 2019 в 02:06

Теги

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