Lidando com serviços - init & systemd
Last updated
Last updated
Serviços - também chamados de daemons - são programas especiais que exigem uma execução, captura de logs e encerramento diferentes de softwares comuns. Geralmente servem uma interface de comunicação local ou remota e seus binários terminam em d, como o httpd, apesar de não ser uma regra.
Alguns exemplos são os serviços SSH, HTTP, DNS, entre vários outros que podem ser implementados por softwares, como o openssh-server, apache2 e avahi-daemon.
No Linux, a forma de gerenciamento dos serviços depende do init system utilizado. O init (também chamado de System V init) é o primeiro processo executado fora do kernel, após o carregamento completo dele. A partir dele, todos os outros são processos filhos em uma estrutura de árvore, como podemos ver na imagem abaixo, obtida pelo comando pstree
.
Há sistemas que não mantém compatibilidade com os comandos do init enquanto estão rodando via systemd. Entretanto, no Ubuntu 22.04, os comandos abaixo, para gerenciamento de serviços, funcionarão corretamente.
Para seguir nos exemplos, vamos instalar um serviço HTTP. Para isso, execute sudo apt install apache2 -y
. A cada exemplo, é possível verificar se o serviço está parado ou rodando acessando http://127.0.0.1 no browser. Caso esteja rodando, a página abaixo será carregada com sucesso.
O service é o binário padrão para executar scripts do init para gerenciar os serviços. Abaixo estão as opções mais utilizadas:
Retorna o status de um serviço - carregado, inativo e ativo - além de outras informações, como PID, linha de comando, descrição e logs. A sintaxe do comando é service nomedoservico status
. Nas duas imagens abaixo estão exemplos de um serviço não ativo e um ativo, respectivamente.
Para iniciar um serviço, utilize service nomedoservico start
. É possível verificar o status da inicialização com service nomedoservico status
.
Para reiniciar um serviço, utilize service nomedoservico restart
.
Utilize service nomedoservico stop
para realizar a parada de um serviço.
O service não contém uma opção para listar os serviços, visto que pela natureza do System V init, ele só realiza a execução de scripts que estão dentro de /etc/init.d. Logo, ao listarmos esse diretório, estaremos efetivamente listando os scripts dos serviços - e podemos usar qualquer um deles como nomedoservico
das opções anteriores.
O systemctl é o comando padrão para gerenciamento de serviços em um sistema que roda o systemd por padrão. Seu uso é bem semelhante ao do comando service
, mas a ordem dos parâmetros muda. Vejamos alguns comandos principais:
Para verificar o status de um serviço, utilize systemctl status nomedoservico.service
. As informações são as mesmas mostradas no service
, porém note que ação vem antes do nome do serviço.
Outra mudança é que temos que especificar qual o tipo de objeto queremos realizar aquela ação. O systemctl serve para gerenciar, além de serviços, timers, mounts, targets e outros tipos de unidades gerenciáveis em um sistema com systemd.
Como estamos tratando de serviços, colocaremos nomedoservico.service
para indicar que aquela ação será realizada em um serviço.
Para iniciar um serviço, simplesmente digite sudo systemctl start nomedoservico.service
. É possível verificar o status da inicialização com sudo systemctl status nomedoservico.service
.
Para reiniciar um serviço, digite sudo systemctl restart nomedoservico.service
.
Parar um serviço também é bem semelhante com o service: sudo systemctl stop nomedoservico.service
. É possível verificar o status da parada com sudo systemctl status nomedoservico.service
.
O systemctl permite habilitar ou desabilitar um serviço para inicializar com o sistema. A ação de habilitar fará com que toda vez que haja um reboot, o serviço irá subir automaticamente, sem necessidade de interação manual para isso, ideal para servidores em produção. A sintaxe do comando para habilitar um serviço é sudo systemctl enable nomedoservico.service
.
Abaixo está uma imagem da habilitação do serviço apache2 e sua habilitação destacada em vermelho. Note que apenas habilitar um serviço não fará com que ele seja executado imediamente, como um start. Para realizar tal ação, execute um comando de start após fazer o enable ou utilize a opção --now
em conjunto com o enable.
Para desabilitar um serviço, execute sudo systemctl disable nomedoservico.service
. Note que essa ação não irá parar o serviço, apenas desabilitá-lo na inicialização do sistema. Para parar o serviço, execute um stop após o disable ou execute o enable com a opção --now
.
Um leitor atento deve ter notado que a imagem acima foi retirada de um outro sistema: o . O motivo é que sistemas mais populares - incluindo o Ubuntu - utilizam outro init system, chamado de systemd. Nesse caso, o primeiro processo é o systemd, conforme imagem abaixo.