Я создал специальный служебный файл, который выглядит так:
[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' timed out. Killing
, очень неприятный. Если вы затем добавите ExecStop=/bin/kill $MAINPID
, проблема тайм-аута исчезнет. Не удаляйте PIDFile
. Вы по-прежнему будете видеть это сообщение, но все действия start / stop / restart / status работают правильно. Может быть, есть другой способ добиться того же лучше. По крайней мере, у меня это работает, и сообщение можно проигнорировать. Когда демон завершает работу, сценарий оболочки также завершает работу, поэтому systemd будет знать об этом.