Eu uso um systemd
serviço para iniciar vários processos quando o Ubuntu 20.04 é inicializado.
# MyApp start app service
[Unit]
Description=MyApp start service
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStartPre=/bin/sleep 20
ExecStart=/etc/init.d/MyApp.sh start
ExecStop=/etc/init.d/MyApp.sh stop
LimitMEMLOCK=infinity
LimitCORE=infinity
RemainAfterExit=yes
User=admin
[Install]
#WantedBy=multi-user.target
#WantedBy=graphical.target
WantedBy=basic.target
Todos os meus processos iniciam após a inicialização do sistema. No entanto, após alguns minutos, o nível de usuário systemd
sai e remove todos os semáforos criados pelos meus processos.
Parece que posso definir RemoveIPC=No configuration /etc/systemd/logind.conf
para impedir que o usuário systemd
remova os semáforos.
Mas por que o usuário systemd
saiu? Devo usar o comando sudo loginctl enable-linger admin
para impedir que ele saia?
Obrigado!
Com base no fato de que:
enable-linger
WantedBy=
alvos apropriados para o--system
ônibus, substituindo-os por um alvo questionável que é comum aos ônibus--system
e--user
.ExecStartPre=/bin/sleep 20
Tenho quase certeza de que você está executando sua unidade no
--user
barramento. Neste caso,User=admin
é ignorado, e um alvo apropriado éWantedBy=default.target
para serviços não GUI ouWantedBy=graphical-session.target
para serviços GUI. Já que vocêWantedBy=graphical.target
comentou, imagino que você deva usarWantedBy=graphical-session.target
.Mas a questão principal é
Type=simple
eRemainAfterExit=yes
.Type=simple
fará com que a unidade pare aoMyApp.sh start
sair.RemainAfterExit=yes
Só faz sentidoType=oneshot
quando você espera que a unidadeExecStart=
saia mais cedo, mas você quer que o status da unidade permaneça "em execução" até que você execute uma ação de parada. Como Marcus Muller sugere,Type=forking
é provavelmente o que você quer, já que os argumentos iniciar/parar se assemelham a um daemon SysV tradicional.No geral, isso é o que eu faria:
Observe o caminho do serviço. Ele está no
*/user/
diretório. Entãosystemctl --user enable --now myapp.service
(não usesudo
). Isso fará com que o programa inicie somente APÓS o usuário logado ter uma sessão de desktop.Adicione esses
Limit*=
itens novamente somente depois de ter certeza de que tudo está funcionando (e somente se necessário). O recursonetwork-online.target
não está disponível no barramento do usuário, então você só precisa garantir que o aplicativo tenha algum recurso para se redefinir quando ocorrerconnect()
algumbind()
erro.