Назад | Перейти на главную страницу

Почему systemctl start myservice не форк этой службы?

Я написал сервис 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