fbpx Certificação Linux: Systemd-timer no Linux (mulplexar terminal) [Guia Básico]

Blog

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

📅 07/12/2021 ⏱ 6 min ✍️ Uira Ribeiro
Linuxcomandos
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:00Unit=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=simpleExecStart=/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-timersNEXT        LEFT   LAST        UNIT         ACTIVATES2019-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 --allNEXT        LEFT   LAST        UNIT         ACTIVATES2019-10-18  8min   2019-10-18  dnf.timer    dnf-makecache.service2019-10-19  13h    2019-10-18  tmp.timer    tmpfiles-clean.servicen/a         n/a     n/a        read.timer   readahead-done.service3 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/arquivoRunning 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 -03Oct 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" updatedbRunning 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-timersNEXT              UNIT            ACTIVATES2019-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]ExecStart=@/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

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Especialista Linux com mais de 20 anos de experiência.
Autor de 5 livros e mentor de mais de 14.000 alunos certificados.
20 certificações de alto nível, incluindo LPIC-3, CKA, RHCE e AWS Solutions Architect.

WhatsApp