Raspbian: utilizando o systemd para executar scripts durante a inicialização

Introduzido no Debian 7, o systemd agora é o sistema de inicialização padrão do Debian Linux (e possivelmente da maioria das distribuições baseadas no Debian, como por exemplo o Raspbian). Ele fornece monitoração avançada, registro e capacidade de gerenciamento de serviços.

Embora ele seja projetado como um substituto do sysvinit e, como tal, faça uso dos scripts de inicialização SysV já existentes, o pacote systemd pode ser seguramente instalado em conjunto com o sysvinit  e iniciado através da opção do kernel init=/bin/systemd. O pacote systemd-sysv fornece o substituto do /sbin/init.

Para mais informações sobre esse assunto, veja o wiki (http://wiki.debian.org/systemd) do Debian.

Esse post mostra como usar o systemd para fazer com que o sistema operacional execute automaticamente um script. Para exemplificar, será utilizado um script que envia um email para o administrador do sistema para que este saiba que o equipamento que foi reiniciado ou desligado está novamente disponível para acesso.

1. Pré-requisitos

Para conseguir executar com sucesso os exemplos desse post é necessário que alguns pré-requisitos sejam atendidos. Abaixo estão listados os pré-requisitos e também links para ajudar a configurar o ambiente de forma correta:

2. Criando o script de envio de email

2.1. Conteúdo do script

2.2. Tornando o script executável

3. Configurando a execução do script

Após a criação do script, devemos definir como deve ser sua execução pelo  systemd, para tanto é imprescindível que o administrador do sistema saiba quais são os serviços e módulos que são iniciados durante o boot, quanto tempo demoram para “subir” e a sequência de inicialização.

3.1. Investigando a inicialização

Para verificar a sequência e o tempo de inicialização dos serviços controlados pelo systemd deve-se executar alguns comandos. O principal comando é o  systemd-analyze plot > systemd.svg que gera um relatório com todas as inicializações, sequência e tempo de inicialização individual.

Segundo a Wikipédia:

SVG é a abreviatura de Scalable Vector Graphics que pode ser traduzido do inglês como gráficos vetoriais escaláveis. Trata-se de uma linguagem XML para descrever de forma vetorial desenhos e gráficos bidimensionais, quer de forma estática, quer dinâmica ou animada. Umas das principais características dos gráficos vetoriais, é que não perdem qualidade ao serem ampliados. A grande diferença entre o SVG e outros formatos vetoriais, é o fato de ser um formato aberto, não sendo propriedade de nenhuma empresa. Foi criado pela World Wide Web Consortium, responsável pela definição de outros padrões, como o HTML e o XHTML.

Como não utilizo ambiente gráfico em meus Raspberry Pi, envio o arquivo por email para que eu consiga visualizar seu conteúdo. Assim sendo, uso o comando:

Caso o parâmetro -A não funcione, envio o conteúdo do arquivo por email para que eu consiga visualizar seu conteúdo:

Ao receber o email na minha estação de trabalho, copio o corpo da mensagem e salvo em um arquivo texto porém com a extensão .svg.

Esse procedimento deverá resultar em uma “imagem” com um gráfico. Para conseguir visualiza-la pode-se utilizar um navegador como Chrome, Chromium ou Firefox. Ou então algum programa de imagem ImageMagick, gimp, inkscape, etc. Abaixo um exemplo:

Exemplo systemd-analyze

4. Configurando a execução do script pelo systemd

4.1. Criando a definição da inicialização

Deve-se criar um arquivo de configuração o qual será responsável por definir os parâmetros da inicialização.

O conteúdo do arquivo deverá ser semelhante à:

Uma das minhas maiores dificuldades em entender o funcionamento desta nova forma de inicialização foi de onde vinham os valores relacionados aos parâmetro After e WantedBy. O arquivo criado no passo 2.1 foi de suma importância para um melhor entendimento do funcionamento do systemd .

No exemplo desse post, o parâmetro After  define que o script será executado após o carregamento dos serviços exim4  e ntp . Eu defini esses “pré-requisitos” uma vez que o script a ser executado precisa usar o serviço de envio de email e também da hora correta do sistema.

O parâmetro  WantedBy define que o término da execução do serviço é necessário para que o serviço  multi-user.target seja iniciado, ou seja, multi-user.target é pré-requisito para multi-user.target.Vide imagem anterior e note no final a linha que contém o texto  startupalert.service

4.2. Efetivando a configuração

O próximo, e último, passo é informar ao systemd que existe um novo “serviço” que deve ser iniciado durante o processo de boot. Para isso, basta executar os comandos:

Lembre-se de executar o comando  systemctl daemon-reload sempre que fizer alterações no arquivo de configuração do serviço ( startupalert.service).

5. Testando a solução

Como o script será executado durante cada inicialização do sistema, para testar se está tudo funcionando basta reiniciar o equipamento e aguardar o recebimento do email de alerta gerado pelo script de exemplo desse post.

6. Outros comandos úteis

O systemd é uma ferramenta bastante poderosa e fornece alguns comandos bem interessantes, sendo eles:

Além dos comandos do próprio systemd, existe o comando  journalctl  o qual mostra a execução do “serviço”.

Para mostrar as mensagens de log da inicialização atual:

Para itens nomeados como <alguma_coisa>.service, você pode usar somente <alguma_coisa>, assim:

Mas para os demais (sockets, targets, timers, etc), você precisa ser explícito.

7. Referências bibliográficas

A introdução do post foi baseada no texto disponível em: https://www.debian.org/releases/stable/amd64/release-notes.pt-br.pdf
Definições dobre o formato de arquivos .svg: https://pt.wikipedia.org/wiki/SVG
Informações detalhadas sobre o systemd (em inglês): https://freedesktop.org/wiki/Software/systemd/

Deixe uma resposta