👨‍💼Lidando com serviços - init & systemd

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.

Árvore de processos de um sistema alpine

Um leitor atento deve ter notado que a imagem acima foi retirada de um outro sistema: o Alpine Linux. 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.

Árvore de processos

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.

service

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:

status

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.

Status inativo de um serviço
Status ativo de um serviço

start

Para iniciar um serviço, utilize service nomedoservico start. É possível verificar o status da inicialização com service nomedoservico status.

Iniciando um processo com service

restart

Para reiniciar um serviço, utilize service nomedoservico restart.

stop

Utilize service nomedoservico stop para realizar a parada de um serviço.

Parando um serviço com service

listando serviços

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.

Listagem dos serviços em um sistema comptível com System V init

systemctl

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:

status

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.

Status de um serviço com systemctl

start

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.

Inicializando um serviço com systemctl

restart

Para reiniciar um serviço, digite sudo systemctl restart nomedoservico.service.

stop

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.

Parando um serviço com systemctl

enable

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.

Habilitando um serviço na inicialização do sistema

disable

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.

Desabilitando um serviço na inicialização do sistema

Last updated