Como agendar tarefas com temporizadores Systemd no Linux

Como agendar tarefas com temporizadores Systemd no Linux

A maneira tradicional de agendar tarefas no Linux é usar o daemon cron, especificando intervalos de tempo e
comandos a serem executados em crontabs.

Systemd, o sistema Init relativamente novo agora adotado por todas as principais distribuições Linux, entre as outras coisas, fornece a capacidade de agendar tarefas usando unidades, chamado Timers. Neste artigo, aprenderemos como eles são estruturados e alguns exemplos de seu uso.

Neste tutorial, você aprenderá:

  • A estrutura básica dos temporizadores do sistema;
  • Como criar temporizadores monotônicos e em tempo real;
  • Como listar e inspecionar temporizadores ativos;
  • Como ativar temporizadores;
  • Como usar temporizadores transitórios;


Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição
Programas Systemd
Outro Conhecimento de conceitos básicos de sistema
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Uso básico



A programação de uma tarefa via SystemD envolve o uso de dois tipos diferentes de unidades: Timers e Serviços. Os primeiros são arquivos de unidade com o .cronômetro Extensão: neles, definimos o cronograma de trabalho e definimos a unidade de serviço que deve ser acionada. Estes últimos são os tipos de unidades mais comuns: eles são usados ​​para definir serviços nas distribuições modernas do Linux e são identificadas pelo .serviço extensão.

Usamos unidades de serviço para definir o comando real a ser executado (se você não estiver familiarizado com os conceitos básicos do Systemd, convém dar uma olhada em nosso artigo sobre serviços Systemd).

Dependendo de como o cronograma é criado, um cronômetro pode ser:

  1. Monotônico
  2. Tempo real

Timers monotônicos

O Systemd fornece uma lista de palavras -chave que podemos usar em uma unidade de temporizador para agendar a execução de uma tarefa por um certo período de tempo após um evento predefinido. As palavras -chave devem ser usadas no [Cronômetro] seção da unidade de temporizador.

Vamos vê -los e explicar o significado deles:



Palavra -chave Significado
ONACTIVESEC Agende a tarefa relativamente para o tempo em que a própria unidade de temporizador é ativada
OnBootSec Programe a tarefa relativamente para o tempo de inicialização do sistema
OnStartupSec Agende a tarefa relativamente para o tempo em que o Systemd começou
OnUnitActiveSec Agende a tarefa relativamente para a última vez que a unidade de serviço estava ativa
OnUnitInActiveSec Agendar a tarefa relativamente para a última vez que a unidade de serviço estava inativa

Como pode ser facilmente adivinhado a partir do nome das chaves, os "segundos" são usados ​​como a unidade padrão do tempo. Podemos, no entanto, especificar uma unidade diferente após o valor (e.g. 15m - quinze minutos). Como veremos mais adiante, as palavras -chave podem ser combinadas dentro de uma unidade de temporizador.

Timers em tempo real

Um evento também pode ser agendado em termos "absolutos", da mesma forma como a definiríamos via Cron, usando outro ONCalendar Palavra -chave e codificações de tempo permitidas.

aqui estão alguns exemplos:



Especificação de tempo Explicação
Qua 18:00:00 A tarefa será executada toda quarta -feira às 18:00
Seg… Wed *-5-27 A tarefa será executada em 27 de maio de cada ano, mas apenas em dias de segunda a quarta -feira
2020-05-27 A tarefa será executada no dia 27 de maio de 2020 às 00:00:00
Qui, sex 2020-*-1,5 11:12:13 A tarefa será executada às 11:12:13 do primeiro e do quinto dia de cada mês do ano 2020, mas apenas se o dia for uma quinta ou sexta -feira
*: 0/2 A tarefa será executada a cada dois minutos a partir do minuto 0
15/2 A tarefa será executada a cada duas horas a partir das 15:00
a cada hora A tarefa será executada no início de cada hora
diário A tarefa será executada todos os dias às 00:00:00
semanalmente A tarefa será executada toda segunda -feira às 00:00:00
por mês A tarefa será executada no primeiro dia de cada mês às 00:00:00

Os dias da semana, se especificados, devem estar em inglês, no formulário abreviado (Wed) ou completo (quarta -feira) (o caso não importa).

Podemos fornecer uma lista de valores de tempo usando o , personagem e especifique uma gama de valores usando .. . A * personagem corresponde a qualquer valor. Mais exemplos podem ser encontrados consultando o Systemd.tempo MANPAGE.

Listando temporizadores ativos

Para listar todo o ativo unidades de timer Em nosso sistema, podemos lançar o listadores de listagem Subcomando de SystemCtl. A menos que o --todos A opção é passada para o comando, apenas os temporizadores ativos estão incluídos no resultado. Aqui está um exemplo da saída produzida pelo comando:

$ systemctl list-timers PRÓXIMO ESQUERDA DURAR PASSADO UNIDADE Ativa Dom 2020-01-19 19:36:06 CET 5H 15min restantes Sáb 2020-01-18 10:38:59 CET 1 dia 3h atrás.Timer Systemdd-tmpFiles-Clean.Serviço Seg 2020-01-20 00:00:00 CET 9H SOL ESQUERDO 2020-01-19 00:00:16 CET 14h atrás Man-DB.Timer Man-DB.Serviço Seg 2020-01-20 00:00:00 CET 9H SOL ESQUERDO 2020-01-19 00:00:16 CET 14H Shadow.sombra do timer.serviço 

O relatório é muito detalhado. Inclui 6 colunas, que descrevem, em ordem:

  1. Na próxima vez que o cronômetro será executado (PRÓXIMO);
  2. Quantas vezes antes da próxima vez que o cronômetro será executado novamente (ESQUERDA);
  3. A última vez que o temporizador foi executado (DURAR);
  4. Quanto tempo passou desde a última vez que o timer foi executado (PASSADO);
  5. O Unidade de temporizador em que o cronograma está definido (UNIDADE);
  6. O Unidade de serviço ativado pelo timer (Ativa).


Um exemplo do mundo real

Vamos examinar o Man-DB.cronômetro cronômetro. Para inspecionar a unidade, podemos usar o SystemCtl e o gato Subcomando:

$ Systemctl Cat Man-DB.cronômetro

Aqui está a definição do timer:

[Unidade] Descrição = Documentação diária de regeneração Man-DB = Homem: Mandb (8) [Timer] ONCALENDAR = DIÁRIO ACCURACYSEC = 12H persistente = true [install] wanted = timers.alvo 

A primeira coisa que podemos notar é o [Unidade] estrofe, que é comum a todos os tipos de unidade Systemd. Aqui é usado para fornecer uma descrição da unidade: podemos ver que o timer é usado para executar uma “regeneração diária de Man-DB”.

A seção que mais nos interessa, no entanto, é [Cronômetro]. Esta estrofe é específica para as unidades do timer: é onde o cronograma é definido. O ONCalendar A palavra -chave é usada para definir um diário cronograma em tempo real.

Também podemos observar outras duas palavras -chave: Accuracysec e Persistente. O primeiro é usado para estabelecer um atraso máximo no qual o serviço pode ser lançado. Nesse caso, o valor é 12h, Portanto, o comando pode ser adiado por um máximo de 12 horas. O valor padrão para Accuracysec é 1 minuto; a melhor precisão é obtida com o 1ns notação (1 nanossegundo).



A outra palavra -chave, Persistente, leva um valor booleano: se definido como true, a última vez que o serviço foi acionado pelo timer é salvo para o disco. Se, por qualquer motivo, uma corrida programada for perdida, na próxima vez que a unidade do timer for ativada, o serviço será lançado imediatamente, se no tempo decorrido ela teria sido acionada pelo menos uma vez. Isso pode ser útil, por exemplo, executar os horários perdidos devido a um sistema desligado, na próxima vez que a máquina for ligada.

Ao examinar mais de perto a definição do timer, podemos notar que o serviço a ser acionado não é mencionado explicitamente: quando isso acontece, o Systemd procura uma unidade de serviço com o mesmo nome do timer (então neste caso Man-DB.serviço). Para fazer referência a uma unidade de serviço explicitamente, devemos usar o Unidade palavra -chave.

Ativando um cronômetro

Ativar um cronômetro é bastante simples. Tudo o que precisamos fazer é colocá -lo, juntamente com o serviço, deve -se acionar, dentro do /etc/Systemd/System diretório. Com todos os arquivos em vigor, executamos:

$ sudo systemctl start .cronômetro

Para fazer um timer ser ativado automaticamente na inicialização (ou quando outro alvo específico é alcançado), tudo o que precisamos fazer é garantir que ele tenha um [Instalar] estrofe, onde especificamos quando a ativação deve acontecer.

No exemplo acima do Procurado A palavra -chave é usada para estabelecer uma dependência reversa (fraca) de uma unidade de destino específica (Timers.alvo - um alvo atingido muito cedo no processo de inicialização) na unidade de temporizador que estamos configurando: antes que esse alvo seja alcançado, nossa unidade deve ser ativada.

Timers transitórios

É possível agendar a execução de tarefas "na mosca", sem criar manualmente o timer e as unidades de serviço usando o uso Systemd-Run. O comando cria unidades temporárias (elas não sobreviverão a uma reinicialização) dentro do /run/systemd/transitório diretório se for executado globalmente e dentro /RUN/User // Systemd/Transiente diretório se lançado como um usuário específico (--do utilizador opção).

Vamos ver um exemplo. Suponha que queremos que a data e a hora sejam registradas em um arquivo a cada minuto. Nós funcionaríamos:

$ Systemd-Run --User --on-calendário '*: 0/1'/bin/sh -c "Data >> ~/log.txt "Timer de execução como unidade: run-r81a4fef38154401bbd8cdbd1e5c19d04.Timer executará o serviço como unidade: run-r81a4fef38154401bbd8cdbd1e5c19d04.serviço 

Como podemos ver na saída do comando, duas unidades temporárias foram criadas, RUN-R81A4FEF38154401BBD8CDBD1E5C19D04.cronômetro e RUN-R81A4FEF38154401BBD8CDBD1E5C19D04.serviço.

Se examinarmos o arquivo de log, podemos ver que o cronômetro está funcionando corretamente:

$ cat ~/log.TXT Seg 20 de janeiro de 2020 11:20:54 CET Seg 20 de janeiro de 2020 11:21:54 CET Seg 20 de janeiro de 2020 11:22:54 CET Seg 20 de janeiro de 2020 11:23:54 CET Seg 20 de janeiro de 2020 11 11 11 : 24: 54 AM CET Seg 20 de janeiro de 2020 11:25:54 CET Seg 20 de janeiro de 2020 11:26:54 CET CET 

Para remover/desativar um Timer transitório, Tudo o que precisamos fazer é impedir isso. Nesse caso, teríamos executado:

$ Systemctl-Stop Stop Run-R81A4FEF38154401BBD8CDBD1E5C19D04.cronômetro

Conclusões

Neste tutorial, aprendemos como podemos agendar tarefas do sistema usando o SystemD Timers como uma alternativa ao Cronjobs. Vimos as estruturas básicas por trás dos temporizadores, como podemos definir cronogramas monotônicos e em tempo real por meio de palavras -chave dedicadas, como OnBootSec ou ONCalendar, Como listar e examinar temporizadores ativos, como habilitá -los e desativá -los.

Finalmente, vimos como usar Timers transitórios. Neste artigo, você deve encontrar tudo o que precisa para começar com os temporizadores. Para obter informações mais detalhadas, você pode querer, no entanto, dar uma olhada na documentação oficial, online ou consultando o Systemd.cronômetro MANPAGE.

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Como criar um trabalho Cron em Kubernetes
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Download do Linux
  • Como executar comandos periodicamente com Anacron no Linux
  • Arquivos de configuração do Linux: os 30 primeiros mais importantes
  • Ubuntu 20.04 truques e coisas que você pode não saber