Systemd-timer no Linux (mulplexar terminal) [Guia Básico]

O gerenciador de serviços Systemd também mantém um serviço de agendamento de tarefas que pode ser utilizado em substituição ao cron. Algumas distribuições nem mais instalam o cron como padrão, utilizando somente o systemd-timer no Linux.

Ao longo do tempo, as distribuições vêm a preferir o systemd para as tarefas de manutenção de sistema.

O systemd utiliza arquivos de unidades (units) de tempo chamados de “Timers” que controlam os serviços ou eventos que serão executados pelo systemd. Esses arquivos têm a extensão .timer e residem geralmente no diretório /lib/systemd/system.

Embora a utilização do agendamento do systemd possa ser um pouco mais complexa que no cron, há algumas vantagens:

  • Cada tarefa tem a sua própria unit de tempo, ou mais de uma se necessário;
  • As units de tempo podem chamar qualquer unit, seja de serviço, montagem, socket, etc;
  • As units de tempo podem ser executadas manualmente;
  • As units de tempo podem depender de outros serviços ou de outras unidades para serem executadas, formando uma lógica para execução de programas ou serviços;
  • As units podem ser agrupadas;
  • Os trabalhos executados são registrados no journal do systemd, que facilita a depuração;

As unidades de tempo podem ser de dois tipos:

  • Timers de tempo real: são ativados por um evento de calendário, da mesma forma que o cron. A opção OnCalendar na unit de tempo é usada para definir este tipo de unidade de tempo.
  • Timers monotônicos: são ativados após um certo de tempo (em segundos) em relação a um evento específico. Este evento pode ser depois de ativado o serviço do timer (OnActiveSec), depois do boot do computador (OnBootSec), depois que o serviço de systemd foi ativado (OnStartupSec) e depois que uma unidade de tempo ficou ativa pela última vez (OnUnitActiveSec).

Para criar uma tarefa de timer do systemd, é necessário criar dois arquivos de unidades: uma de tempo e outra com o serviço ou comando que será executado. Primeiro pode-se criar a unit de tempo:

[Unit]
Description=Backup do MySQL
[Timer]
OnCalendar=*-*-* 03:00:00
Unit=backup.service
[Install]
WantedBy=multi-user.target

Esta unit deve ficar no diretório /usr/lib/systemd/system/ com o nome backup.timer. Observe que ela vai executar todos os dias as 03 horas da amanhã, e chamar a unit backup.service. Agora é necessário criar a unit de serviço que vai ser executada pela unit backup.timer:

[Unit]
Description=Backup do MySQL
[Service]
Type=simple
ExecStart=/var/backup.sh
[Install]
WantedBy=multi-user.target

Este arquivo também deve ficar no diretório /usr/lib/systemd/system/ com o nome backup.service. Observe que esta unit executará o script /var/backup.sh. Este script por sua vez deverá ter permissão de execução “X”. Feito isto, deve-se habilitar a unit do temporizador para executar no boot com a opção “enable” do comando systemctl:

# systemctl enable backup.timer

E também coloca-la em execução com a opção “start” do comando systemctl:

# systemctl start backup.timer

Toda a vez que for necessário alterar a configuração de uma unit, é preciso reiniciar o serviço do systemd:

# systemctl daemon-reload

Para visualizar as units de tempo que estão configuradas, pode-se usar a opção “list-timers” do comando systemctl:

# systemctl list-timers
NEXT LEFT   LAST UNIT        ACTIVATES
2019-10-19  10h 2019-10-18 backup.timer backup.service

Para listar todas as units de tempo, mesmo aquelas que não estão ativas, pode-se usar a opção “list-timers –all”:

# systemctl list-timers --all
NEXT        LEFT   LAST        UNIT        ACTIVATES
2019-10-18 8min 2019-10-18 dnf.timer   dnf-makecache.service
2019-10-19 13h 2019-10-18 tmp.timer tmpfiles-clean.service
n/a n/a n/a        read.timer readahead-done.service
3 timers listed.

Para parar a unit de tempo, pode-se usar a opção “stop” do comando systemctl:

# systemctl stop backup.timer

E pode-se executar a unit do backup.service a qualquer hora com o comando:

# systemctl start backup.service

Unidades de Tempo Passageiras (Transientes)

O systemd também pode ser utilizado para criar units de tempo transientes (passageiras), que irão executar uma única vez numa determinada data, sem a necessidade de se criar uma unidade de serviço.

Para fazer isso, utilizamos o comando systemd-run.

systemd-run

As opções que o systemd-run aceita são:

  • –on-active=: numero de segundos depois que o sistema de timer ficou ativo.
  • –on-boot=: número de segundos depois que o computador iniciou.
  • –on-startup=: número de segundos depois que o systemd iniciou.
  • –on-unit-active=: número de segundos depois que uma unit ficou ativa
  • –on-unit-inactive=: número de segundos depois que uma unit ficou inativa
  • –on-calendar=: data no calendário para execução da tarefa.

Exemplos:

Neste exemplo, o timer irá criar um arquivo chamado /tmp/arquivo depois de 30 segundos depois que foi ativado:

# systemd-run --on-active=30 /bin/touch /tmp/arquivo
Running timer as unit run-1642.timer.
Will run service as unit run-1642.service.

A execução do timer pode ser visualizada no Jornal do Systemd com o comando journalctl:

# journalctl -b -u run-1642.service
-- Logs begin at Tue 2019-04-09 15:46:28 -03
Oct 18 16:05:05 systemd[1]: Started /bin/touch /tmp/arquivo.

Para executar o comando updatedb numa determinada data, pode-se usar a opção “–on-calendar=” segundo de uma data entre aspas:

# systemd-run --on-calendar="sun 13:50" updatedb
Running timer as unit run-2948.timer.
Will run service as unit run-2948.service.

Depois de criado a unidade de tempo e de serviço com o systemd-run, pode-se usar o comando “systemctl list-timers” para ver a unit timer criada:

# systemctl list-timers
NEXT UNIT        ACTIVATES
2019-10-20 13:50  run-2948.timer run-2948.service

O conteúdo da unit criada pelo systemd-run pode ser visto com o comando “systemctl cat run-2948”:

# systemctl cat run-2948
[Unit]
Description=/bin/updatedb
[Service]
[email protected]/bin/updatedb "/bin/updatedb"

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe