Usando temporizadores Systemd como um substituto para tarefas Cron

Usando temporizadores Systemd como um substituto para tarefas Cron
Uma fotografia de uma mulher segurando um despertador enquanto está em frente a um laptop.

Como um usuário Linux, você provavelmente está familiarizado com o cron. Ele tem funcionado como o agendador de tarefas baseado em tempo do Unix por muitos anos. Agora, muitos usuários estão usando timers Systemd para substituir o domínio do cron. Este artigo discutirá os princípios básicos de como configurar seu próprio timer systemd e garantir que ele esteja funcionando corretamente em seu sistema.

Por que usar temporizadores Systemd em vez de Cron?

Um dos maiores pontos de venda do Systemd Timers é que ele é totalmente integrado ao ecossistema Systemd. Isso significa que é muito fácil agendar e vincular várias unidades de serviço Systemd, facilitando a automatização de tarefas em comparação a um daemon cron tradicional.

Um terminal mostrando um serviço do sistema usando um timer Systemd.

Outra vantagem dos Systemd Timers sobre o Cron é que eles fornecem um controle mais detalhado sobre como disparar seus trabalhos agendados. Por exemplo, os Systemd Timers têm uma OnBootSecvariável, que permite que você adie sua unidade de serviço até que um certo tempo passe após uma inicialização bem-sucedida.

Um terminal mostrando um exemplo de configuração de timer com uma variável de gatilho especial.

Por fim, os Systemd Timers também são incrivelmente precisos em comparação a um daemon cron padrão. Por padrão, ele pode rastrear e executar trabalhos até um microssegundo usando sua AccuracySecvariável. Isso é incrivelmente útil se você estiver executando um computador que requer tempos exatos para suas tarefas agendadas.

Instalando temporizadores Systemd

Timers são uma função interna do Systemd. Isso significa que se você estiver usando o Systemd como seu daemon init, como é o caso de distros Linux populares como Arch, Fedora e Ubuntu, sua máquina já está aproveitando esse recurso em alguns de seus processos de sistema.

Para verificar se sua distribuição está executando o Systemd, você pode executar o seguinte comando:

Isso listará todas as unidades, dispositivos e temporizadores do Systemd que estão em execução no seu sistema.

Um terminal mostrando a saída do comando systemctl em uma distribuição Linux baseada em Systemd.

Listar temporizadores existentes

A maneira mais fácil de verificar se um timer está em execução na sua conta de usuário atual é com o seguinte comando:

Você também pode usar o --allsinalizador para verificar cada temporizador no sistema, incluindo os inativos:

Isso imprimirá a data e a hora em que cada timer será ativado, a contagem regressiva até aquele ponto, quanto tempo se passou desde a última execução, o nome da unidade do próprio timer e o serviço que cada unidade do timer ativa.

Um terminal listando todos os timers Systemd em execução na sessão atual.

Criando um novo serviço e temporizador

O primeiro passo para criar um timer Systemd é criar ou encontrar um serviço existente para anexá-lo. Isso ocorre porque cada timer precisa ser anexado a uma unidade de serviço pai. Esta seção o guiará pelo processo de criação de um timer para um serviço Systemd personalizado.

Comece criando os arquivos em branco “.service” e “.timer” no seu diretório home:

Abra seu novo arquivo de serviço usando seu editor de texto favorito:

Cole o seguinte modelo dentro do seu novo arquivo de serviço:

Salve seu arquivo “.service” e abra seu arquivo “.timer” em branco usando o mesmo editor de texto:

Cole o seguinte bloco de código dentro do seu arquivo de timer:

Vá para a [Timer]seção, então substitua o valor da OnCalendarvariável pela data e hora que você quer que sua unidade Systemd rode. No meu caso, eu quero que meu programa rode exatamente às 11:43 AM todos os dias.

Um terminal destacando o valor do timer personalizado para a variável OnCalendar.

Criando um cronômetro monotônico

Além de definir um timer que seja executado em uma data específica, também é possível criar um timer monotônico que seja executado em relação ao tempo de atividade atual do seu computador. Isso é útil se você estiver agendando uma tarefa em uma máquina que não esteja em execução constante, como em um desktop ou laptop.

Para começar, abra seu arquivo “.timer” e role para baixo até a [Timer]seção.

Um terminal destacando a localização do

Remova as variáveis OnCalendar​​e Persistent, então adicione OnBootSecseguido por um intervalo de tempo para quando você quer executar seu arquivo unit. Por exemplo, defini-lo como “1hr” dirá ao Systemd para iniciar seu comando uma hora após seu computador inicializar com sucesso.

Um terminal destacando a variável OnBootSec substituindo as variáveis ​​de temporização originais do arquivo de timer personalizado.

Adicione a OnUnitActiveSecvariável logo abaixo OnBootSece, em seguida, forneça o intervalo que você quer que seu timer execute continuamente após a inicialização do sistema. No meu caso, vou defini-lo como “30min”, pois quero que minha tarefa seja executada a cada 30 minutos após sua execução inicial.

Um terminal destacando a variável OnUnitActiveSec que converte o temporizador de execução única em um temporizador monotônico.

Criando um temporizador transitório

Um dos benefícios do Systemd Timer ser profundamente integrado ao Systemd é que ele pode tirar vantagem dos outros programas adjacentes do daemon init. Por exemplo, é possível usar timers com Systemd-run para criar trabalhos transitórios únicos na sua máquina.

Para criar um temporizador temporário simples, cole a seguinte linha de código em uma sessão de terminal e substitua o valor da --on-calendarvariável pelo intervalo em que você deseja que seu comando seja executado:

Anexe o comando que você deseja executar no final da linha e pressione Enterpara agendá-lo.

Você também pode criar temporizadores monótonos temporários usando as variáveis --on-boot​​e --on-unit-active:

Confirme se seu timer temporário agora está na fila do agendador de tarefas do Systemd executando o seguinte comando:

Um terminal que mostra o status de um temporizador transitório carregado no sistema.

Executando o Systemd Timer

Para executar seu novo Systemd Timer, você precisa ter certeza de que ele está carregado corretamente na sua sessão Systemd atual. Para isso, copie seu serviço personalizado e o arquivo timer para o diretório de serviços do seu Systemd:

Recarregue a configuração atual do daemon init:

Ative o serviço e o timer que você criou usando systemctl:

Verifique se você carregou seu novo timer corretamente executando: sudo systemctl status my-new-timer.timerem uma nova sessão de terminal. Neste caso, você pode ver que meu timer agora está agendado e preparado para o sistema executar.

Um terminal mostrando o arquivo de timer em execução no sistema atual.

Aprender como agendar tarefas usando Systemd Timers é apenas uma parte de entender como sua máquina Linux funciona por baixo dos panos. Mergulhe mais fundo nos detalhes internos deste maravilhoso SO olhando nosso artigo de comparação sobre Grub e Systemd-boot.

Crédito da imagem: Alexandr Podvalny via Unsplash . Todas as alterações e capturas de tela por Ramces Red.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *