Eu tenho este service
arquivo:
[Unit]
Description=MyService
[Service]
User=root
WorkingDirectory=/path/to/workingdir
ExecStart=/path/to/myservice
[Install]
WantedBy=multi-user.target
Quando inicio myservice
na linha de comando, ele inicia e desamoniza. Quando eu inicio com -d
(para depuração), ele não desativa, mas para ao pressionar Enter.
Porém, quando coloco como myservice
no service
arquivo, ele não inicia de jeito nenhum:
[root@localhost bin]# systemctl status myservice.service
● myservice.service - MyService
Loaded: loaded (/etc/systemd/system/myservice.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Tue 2023-08-22 09:20:21 CEST; 4min 1s ago
Process: 1790032 ExecStart=/path/to/myservice (code=exited, status=0/SUCCESS)
Main PID: 1790032 (code=exited, status=0/SUCCESS)
Aug 22 09:20:21 localhost.localdomain systemd[1]: Started MyService
Aug 22 09:20:21 localhost.localdomain myservice[1790033]: myservice started with:
Aug 22 09:20:21 localhost.localdomain myservice[1790033]: current working dir: /path/to/workingdir
Aug 22 09:20:21 localhost.localdomain systemd[1]: myservice.service: Succeeded.
E ao iniciá-lo com -d
, ele inicia, mas aumenta em até 90% o uso da CPU.
Como devo configurar um service
arquivo para um programa que é daemonizado sozinho?
Ele inicia, mas da perspectiva do systemd também para imediatamente. O padrão
Type=simple
diz ao systemd para esperar que o PID inicial também seja o PID principal; assim que o processo termina, o serviço "para".Use
Type=forking
para um serviço que daemoniza. O Systemd aguardará a saída do processo inicial e rastreará o filho como o PID principal. (Normalmente, ele adivinhará o PID principal automaticamente, mas em alguns casos raros, pode ser necessário que o serviço grave um arquivo pid e especifique-o no systemd.)Seria melhor se o serviço tivesse "depurar" e "não daemonizar" como duas opções separadas. (E seria ainda melhor se o serviço reconhecesse automaticamente o protocolo Type=notify do systemd...)