Por que o 'systemctl start myservice' não possui este serviço?

2

Eu escrevi um serviço systemd.

Quando executo systemctl start foo.service , o serviço é iniciado e executado corretamente, mas systemctl não retorna imediatamente ao shell.

Depois de um tempo, sai com

Job for foo.service failed because a timeout was exceeded.

e, em seguida, o serviço não está mais sendo executado.

Aqui está foo.service, eu RTFM e usei Type=forking com um comando que se bifurca:

[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 não é fork, então /my/path/fork é o seguinte

#!/bin/bash
PATH="$PATH:/my/path" "$@" &

Por que esse serviço não é bifurcado e executado em segundo plano como esperado? Eu fiz tudo como root no CentOS.

    
por spraff 29.12.2016 / 01:28

1 resposta

2

Serviço Tipo = forking é para programas verdadeiramente bifurcados (apache, por exemplo). Seu script bash só executa outro script em segundo plano. Isso não é exatamente o que o systemd quer como programa de bifurcação. Por que você está usando

Type=forking

, quando seu script my-script é um serviço simples e normal?

Tente alterar o tipo de serviço e execute seu script diretamente com isso:

[Service]
Type=simple
PIDFile=/var/run/myservice.pid
ExecStart=/my/path/my-script my-args

E remova o arquivo inteiro / my / path / fork . Eu não consigo ver nenhum lucro disso.

Além disso, você pode tentar definir a opção TimeoutStartSec = 1 para o arquivo de configuração do serviço.

Estou usando um script bash contendo loop infinito com essa configuração:

[Service]
User=root
ExecStart=/root/ha.sh
WorkingDirectory=/root/
KillSignal=SIGKILL
Restart=on-abort
Type=simple
TimeoutStartSec=1
TimeoutStopSec=1
StandardError=syslog
NotifyAccess=all
    
por 22.10.2018 / 16:35