Я создал специальный служебный файл, который выглядит следующим образом:
[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 для выполнения моего двоичного файла)
Если вам нужно запустить сценарий оболочки только один раз, то просто добавьте ExecStartPre = / path / to / script
и запустите ваш демон с помощью ExecStart = / path / to / daemon
. Сценарий не запускается при перезапуске, возможно, это не то, что вам нужно.
Если вам нужно запускать сценарий и при перезагрузке, установите Type = simple
и запустите демон в режиме переднего плана из сценарий оболочки, поэтому сценарий не завершится. Но вы по-прежнему получаете это сообщение, и действия остановки / перезапуска ожидаются за 30 секунд до истечения времени ожидания State 'stop-sigterm'. Убийство
, очень неприятное. Если вы затем добавите ExecStop = / bin / kill $ MAINPID
, проблема тайм-аута исчезнет. Не удаляйте PIDFile
. Вы по-прежнему будете видеть это сообщение, но все действия start / stop / restart / status работают правильно. Может быть, есть другой лучший способ добиться того же. По крайней мере, у меня это работает, и сообщение можно проигнорировать. Когда демон завершает работу, сценарий оболочки также завершает работу, поэтому systemd будет знать об этом.