Bifurcando em um script systemd

10

Eu quero que o serviço systemd lide com bifurcação (meu arquivo não lida com bifurcação por si só. Então, estou contando com o systemd para lidar com isso)

Meu arquivo .service:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Questão

Especificar o Type=forkingsuficiente para o que estou tentando alcançar? Ou é semelhante a esperar bifurcação no iniciante, o que realmente diz ao iniciante (se eu entendi direito, não tenho certeza se entendi, sou novo em escrever initscripts) que meu serviço lidaria com bifurcação / daemonização.

alonisser
fonte

Respostas:

16

O systemd possui excelente documentação. Veja a página em arquivos de serviço :

Se definido como bifurcação, espera-se que o processo configurado com ExecStart = chame fork () como parte de sua inicialização. Espera-se que o processo pai saia quando a inicialização estiver concluída e todos os canais de comunicação estiverem configurados. O filho continua sendo executado como o processo principal daemon. Esse é o comportamento dos daemons tradicionais do UNIX. Se essa configuração for usada, é recomendável também usar a opção PIDFile =, para que o systemd possa identificar o processo principal do daemon. O systemd continuará com as unidades de acompanhamento assim que o processo pai terminar.

Portanto, usar isso typefará com que o systemd espere até o swampretorno e considere que ainda está em execução: fazer com que isso aconteça continua sendo sua responsabilidade ...

jasonwryan
fonte
5
Se o script não faz bifurcação, é oneshot(um script típico de execução curta) ou simple(um serviço de execução longa que não bifurca + sai).
Pavel Šimerda
4
Você consideraria um script (Bash?) Bifurcar outro processo quando o plano de fundo fosse usado com e comercial &?
Felipe Alvarez
5
@FelipeAlvarez sim, o operador e comercial no bash é equivalente a um fork e exec.
Thayne
1

Se você deseja que o systemd lide com bifurcação, use eg Type=simpleou Type=notify. Então o systemd fará o garfo para você.

Se você pode modificar o swampexecutável, então Type=notifyé a melhor solução. O executável deve notificar o systemd quando for inicializado com êxito. Isso significa que systemctl start swampaguardará a inicialização do pântano quando chamado da linha de comando e imprimirá qualquer mensagem de erro ao inicializar na linha de comando, que é o que você geralmente deseja.

Para um exemplo de um executável gravado para usar Type = notify, consulte o seguinte shellscript:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
user3049102
fonte