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]
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
Tag:/dev, bash, certificação, certificaçãolinux, code, Comptia, developer, empreendedorismo, exame, freesoftware, gnu, hack, Linux, linuxfan, linuxfun, linuxmint, lovelinux, LPI, LPIC, management, nerd, opensource, php, prova, shell, software, softwarelivre, sql, tech, ti, unix