Como agendar tarefas com temporizadores Systemd no Linux
- 2877
- 788
- Howard Fritsch
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
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:
- Monotônico
- 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:
- Na próxima vez que o cronômetro será executado (PRÓXIMO);
- Quantas vezes antes da próxima vez que o cronômetro será executado novamente (ESQUERDA);
- A última vez que o temporizador foi executado (DURAR);
- Quanto tempo passou desde a última vez que o timer foi executado (PASSADO);
- O
Unidade de temporizador
em que o cronograma está definido (UNIDADE); - 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
- « E não conseguir localizar o pacote - erro de instalação do pacote apt
- Instalar anel, uma alternativa de VoIP do VoIP »