Como posso executar um executável como um serviço?

2

No Ubuntu 18.04, posso iniciar ou parar alguns serviços por

sudo service cron start/stop

Eu posso listar alguns serviços por

service --status-all

A saída corresponde aos arquivos em /etc/init.d/ .

Ouvi dizer que existem várias maneiras de gerenciar serviços: sistema V init, systemd, upstart, .... Qual deles estou usando? man service mostra que é o init do sistema V. Mas ouvi dizer que o Linux substitui o init pelo systemd. Devo usar o systemd em vez do init no Ubuntu?

Como posso fazer um arquivo executável arbitrário (ELF ou shell script) se tornar um serviço?

Eu preciso explicitamente daemonizar o executável por setsid , como o link ?

Alguma das postagens abaixo se aplica a mim?

Obrigado.

    
por Tim 31.10.2018 / 23:26

2 respostas

1

O que é o gerenciador de serviço do daemon nativo no meu sistema?

Em mais linux init é onde todos os outros serviços e processos são gerados.

O gerenciador de serviço daemon nativo pode ser encontrado por man init .

    
por 01.11.2018 / 15:32
1

On Ubuntu 18.04, [...]

I heard there are several ways of managing services: system V init, systemd, upstart, .... Which one am I using?

Você está usando o systemd, esse é o init fornecido no Ubuntu 18.04. (Também no Ubuntu 16.04, no Fedora, no openSUSE, no Arch Linux, no RHEL 7, no CentOS 7, no CoreOS, e também é o padrão no Debian 9.)

Uma boa maneira de confirmar que você está executando o systemd é executar o comando systemctl . Se estiver disponível e produzir saída quando executado, você estará executando o systemd.

On Ubuntu 18.04, I can start or stop some service by

sudo service cron start/stop

I can list some services by

service --status-all

Por favor, note que o comando service enviado em algumas distribuições systemd existe principalmente para compatibilidade com versões anteriores. Você deve tentar gerenciar serviços usando systemctl .

Por exemplo:

$ sudo systemctl start cron
$ sudo systemctl stop cron
$ systemctl status cron

E você pode encontrar o status de todas as unidades com um simples

$ systemctl

The output matches the files under /etc/init.d/.

Isso não é necessariamente o caso de systemctl , já que as unidades nativas do systemd são armazenadas em /etc/systemd/system/ e /usr/lib/systemd/system/ .

O

systemd inclui compatibilidade com scripts antigos do SysV init (por meio de systemd-sysv-generator , que cria uma unidade de serviço nativa do systemd chamando os comandos do script de inicialização), portanto, se você tiver scripts de inicialização em /etc/init.d/ , eles provavelmente também serão exibidos no systemd.

Shall I use systemd instead of init on Ubuntu?

Esta pergunta não está clara.

O termo init geralmente se refere ao primeiro processo executado quando o sistema inicializa, o processo é executado com PID 1. systemd é executado com PID 1, então por definição systemd é um init (e assim foi upstart antes dele, e o SysV init também.)

Se você está perguntando "devo usar o systemd ao invés do SysV init?", então você já está usando o systemd ao invés do SysV init, já que você está no Ubuntu 18.04. (E, como apontado acima, a maioria das distribuições que você escolheria hoje em dia provavelmente incluiria o systemd como seu init.)

Agora, você poderia estar perguntando "devo usar unidades systemd em vez de scripts de inicialização ?" e essa pergunta é mais relevante, já que você pode escolher aqui onde ambas as opções funcionarão.

Minha recomendação aqui é que você deve gerenciar serviços usando unidades systemd, que é o modo nativo de operação. Criar um script de init simplesmente adiciona uma camada de indiréção (já que o gerador criará uma unidade systemd para você de qualquer forma). Além disso, escrever unidades systemd é mais simples do que escrever scripts init, já que você não precisa se preocupar em daemonizing e scrubbing o ambiente antes da execução, já que o systemd faz tudo isso por você.

How can I make an arbitrary executable file (either ELF or shell script) become a service?

Crie uma unidade de serviço systemd para ela.

Veja os exemplos na página man. O exemplo mais simples mostra como é fácil criar uma unidade de serviço:

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target

Armazene esta unidade em /etc/systemd/system/foo.service , depois recarregue o systemd para ler este arquivo de unidade com:

$ sudo systemctl daemon-reload

Inicie o serviço com:

$ sudo systemctl start foo.service

E habilite-o durante a inicialização com:

$ sudo systemctl enable foo.service

Você pode verificar o status do serviço com:

$ systemctl status foo.service

Naturalmente, o systemd pode fazer muito mais para você gerenciar serviços, portanto, uma unidade systemd típica será mais longa que essa (embora não necessariamente muito mais complexa). Procure as unidades fornecidas com o Ubuntu em /usr/lib/systemd/system/*.service para obter uma imagem melhor do que é típico, do que esperar.

Do I need to explicitly daemonize the executable by setsid, like https://stackoverflow.com/a/19235243/156458?

Não! Não corra em segundo plano, não se preocupe com grupos de processos ou sessões, etc. O systemd cuida de tudo isso para você. Basta escrever seu código para rodar em primeiro plano e o systemd cuidará do resto.

(Se você tem um serviço que roda em segundo plano, o systemd pode gerenciá-lo, com Type=forking , mas as coisas são muito mais fáceis quando executados em primeiro plano, então faça isso se você estiver iniciar um novo serviço.)

Does any of the post below apply to me?

Este é sobre aplicativos que usam o framework Java "Spring Boot". A menos que você esteja escrevendo código Java e usando essa estrutura, isso não é relevante. Se você estiver escrevendo código Java, tente apenas executar seu serviço em primeiro plano.

A questão é sobre o upstart, a resposta é sobre os scripts init do SysV. Embora os scripts init do SysV trabalhem com o systemd, é preferível que você escreva unidades systemd diretamente, como mencionado acima.

Então, não, eu diria que nenhum desses é relevante.

Eu recomendaria tentar aprender mais sobre as unidades de serviço do systemd.

Este site também é um ótimo recurso para isso, então sinta-se à vontade para postar mais perguntas sobre isso enquanto você explora escrevendo suas próprias unidades de sistema para seus serviços.

    
por 15.11.2018 / 08:32