Я написал сервис systemd.
Когда я бегу systemctl start foo.service
, служба запускается и работает правильно, но systemctl
не возвращается сразу в оболочку.
Через некоторое время он выходит с
Job for foo.service failed because a timeout was exceeded.
а затем служба больше не работает.
Вот foo.service, я RTFM и использовал Type=forking
с командой, которая разветвляется:
[Unit]
Description=blah blah
[Service]
Type=forking
PIDFile=/var/run/myservice.pid
ExecStart=/my/path/fork my-script my-args
[Install]
WantedBy=multi-user.target
my-script
сам не разветвляется, поэтому /my/path/fork
как следует
#!/bin/bash
PATH="$PATH:/my/path" "$@" &
Почему эта служба не разветвляется и не работает в фоновом режиме, как ожидалось? Я все сделал как root на CentOS.
обслуживание Тип = разветвление предназначен для действительно разветвленных программ (например, apache). Ваш сценарий bash запускает только другой сценарий в фоновом режиме. Это не совсем то, что systemd хочет в качестве разветвленной программы. Почему вы используете
Type=forking
, когда твой скрипт my-script - это обычный простой сервис?
Попробуйте изменить тип службы и запустить свой скрипт напрямую следующим образом:
[Service]
Type=simple
PIDFile=/var/run/myservice.pid
ExecStart=/my/path/my-script my-args
И удалить весь / мой / путь / вилку файл. Я не вижу в этом никакой выгоды.
Также вы можете попробовать установить TimeoutStartSec = 1 опция для обслуживания файла конфигурации.
Я использую сценарий bash, содержащий бесконечный цикл, с такой конфигурацией:
[Service]
User=root
ExecStart=/root/ha.sh
WorkingDirectory=/root/
KillSignal=SIGKILL
Restart=on-abort
Type=simple
TimeoutStartSec=1
TimeoutStopSec=1
StandardError=syslog
NotifyAccess=all