Как заставить systemd отслеживать фоновый процесс

Файл модуля

[root@myserver system]# cat /etc/systemd/system/thiru.service
[Unit]
Description=My service

[Service]
Type=forking
PIDFile=/var/run/thiru.pid
ExecStart=/tmp/thiru.sh start
ExecStop=/tmp/thiru.sh stop

Мой сценарий

[root@myserver system]# cat /tmp/thiru.sh
#!/bin/sh

loop()
{
    while true
    do
        sleep 5
    done
}

if [ "$1" = "start" ]; then
    loop &
    echo "$!" > /var/run/thiru.pid
fi

if [ "$1" = "stop" ]; then
    kill $(cat /var/run/thiru.pid)
    rm -f /var/run/thiru.pid
fi

Теперь он отлично работает, когда я делаю systemctl start thiru.service. Но когда я запускаю службу, напрямую вызывая скрипт /tmp/thiru.sh start, systemctl этого не обнаруживает.

[root@myserver system]# /tmp/thiru.sh start
[root@myserver system]# systemctl status thiru.service
thiru.service - My service
   Loaded: loaded (/etc/systemd/system/thiru.service; static)
   Active: inactive (dead)

Jul 27 04:14:08 myserver systemd[1]: Starting My service...
Jul 27 04:14:08 myserver systemd[1]: Started My service.
Jul 27 04:14:17 myserver systemd[1]: Stopping My service...
Jul 27 04:14:17 myserver systemd[1]: Stopped My service.

Есть ли способ заставить systemd определить, что моя служба запущена? Возможно, используя файл PID?


person Thirupathi Thangavel    schedule 27.07.2015    source источник


Ответы (1)


systemd отслеживает только те процессы, которые запустил сам.

Вам больше не нужно писать конкретную функцию запуска/остановки в скрипте. Просто вызовите основную часть вашего скрипта в ExecStart=.

Вам больше не нужен файл PID. systemd может отслеживать все процессы, запускаемые вашим скриптом, с помощью cgroups. Если systemctl stop thiru не убьет все процессы, то это сделает systemctl kill --signal=term thiru.

person Timothée Ravier    schedule 08.08.2015