Tutorial

Como usar o Cron para automatizar tarefas no CentOS 8

Published on April 9, 2020

Manager, Developer Education

Português
Como usar o Cron para automatizar tarefas no CentOS 8

Shaun Lewis escreveu uma versão anterior deste tutorial.

Introdução

O Cron é um programa daemon de agendamento de trabalhos baseado em tempo, encontrado em sistemas operacionais do tipo Unix, incluindo as distribuições do Linux. O Cron executa em segundo plano e tarefas agendadas com o cron, conhecidas como “cron jobs” (trabalhos do cron), são executadas automaticamente, o que torna o cron útil para automatizar tarefas relacionadas à manutenção.

Este guia fornece uma visão geral sobre como programar tarefas usando a sintaxe especial do cron. Ele também revisa alguns atalhos que você pode usar para tornar as agendas de trabalho mais fáceis de escrever e de entender.

Pré-requisitos

Para completar este guia, você precisará de acesso a um computador que executa em CentOS 8. Pode ser sua máquina local, uma máquina virtual ou um servidor virtual privado.

Independentemente do tipo de computador que você usar para acompanhar este guia, ele deverá possuir um usuário não raiz com privilégios administrativos configurados. Para configurar isso, siga as instruções de nosso Guia de configuração inicial de servidor para o CentOS 8.

Instalando o Cron

Por padrão, quase toda distribuição do Linux tem alguma forma do cron instalada. No entanto, se estiver usando uma máquina com CentOS na qual o cron não estiver instalado, instale-o usando o comando dnf.

Antes de instalar o cron em uma máquina CentOS, atualize o índice de pacotes local do computador:

  1. sudo dnf update

Então, instale o daemon cron com o seguinte comando:

  1. sudo dnf install crontabs

Esse comando solicitará que você confirme se deseja instalar o pacote crontabs e suas dependências. Faça isso pressionando y e, depois, ENTER.

Isso instalará o cron em seu sistema, mas será necessário iniciar o daemon manualmente. Você também precisará garantir que ele esteja configurado para executar sempre que o servidor for iniciado. Você pode realizar ambas essas ações com o comando systemctl.

Para iniciar o daemon cron, execute o seguinte comando:

  1. sudo systemctl start crond.service

Para definir o cron para executar sempre que o servidor for iniciado, digite:

  1. sudo systemctl enable crond.service

Depois disso, o cron estará instalado no seu sistema, pronto para que você comece a agendar trabalhos.

Entendendo como o Cron funciona

Os trabalhos do cron são registrados e gerenciados em um arquivo especial conhecido como crontab. Cada perfil de usuário no sistema pode ter seu próprio arquivo crontab - onde o usuário poderá agendar trabalhos - que fica armazenado em /var/spool/cron/.

Para agendar um trabalho, simplesmente abra seu crontab para edição e adicione uma tarefa escrita na forma de uma expressão cron. A sintaxe para expressões cron pode ser dividida em dois elementos: o agendamento e o comando a executar.

O comando pode ser praticamente qualquer comando que você executaria normalmente na linha de comando. O componente de agendamento da sintaxe é dividido em 5 campos diferentes, os quais vêm escritos na seguinte ordem:

Campo Valores permitidos
minuto 0-59
hora 0-23
Dia do mês 1-31
mês 1-12 ou JAN-DEC
Dia da semana 0-6 ou SUN-SAT

Juntas, as tarefas agendadas em um arquivo crontab são estruturadas da seguinte forma:

minute hour day_of_month month day_of_week command_to_run

Apresentamos aqui um exemplo funcional de uma expressão cron. Essa expressão executa o comando curl http://www.google.com, toda terça-feira, às 5:30 PM:

30 17 * * 2 curl http://www.google.com

Também existem alguns caracteres especiais que você pode incluir no componente de agendamento de uma expressão cron para facilitar o agendamento:

  • *: em expressões cron, um asterisco é uma variável curinga que representa “todos”. Assim, uma tarefa agendada com * * * * * ... será executada a cada minuto, de cada hora, de cada dia, de cada mês.
  • ,: vírgulas separar os valores do agendamento para formar uma lista. Se quiser executar uma tarefa no início e na metade de cada hora, em vez de escrever duas tarefas separadas (por exemplo, 0 * * * * ... e 30 * * * * ...), poderia conseguir a mesma funcionalidade com um (0,30 * * * * ...).
  • -: um hífen representa um intervalo de valores no campo da agenda. Em vez de ter 30 tarefas agendadas separadamente em relação a um comando que você quer executar nos primeiros 30 minutos de cada hora (como em 0 * * * * ..., 1 * * * * ..., 2 * * * * ... e assim por diante), bastaria que você as agendasse como 0-29 * * * * ....
  • /: utilize uma barra com um asterisco para expressar um valor de etapa. Por exemplo, em vez de escrever oito tarefas cron separadas para executar um comando a cada três horas (como em: 0 0 * * * ..., 0 3 * * * ..., 0 6 * * * ... e assim por diante), você poderia agendá-las para executar da seguinte maneira: 0 */3 * * * ....

Nota: você não pode expressar valores de etapa de modo arbitrário; você só pode usar números inteiros que se dividam de maneira uniforme no intervalo permitido pelo campo em questão. Por exemplo, no campo “horas”, você só poderia usar uma barra antes de 1, 2, 3, 4, 6, 8 ou 12.

Apresentamos a seguir, outros exemplos de como usar o componente de agendamento do cron:

  • * * * * * - Executa o comando a cada minuto.
  • 12 * * * * - Executa o comando 12 minutos após cada hora.
  • 0,15,30,45 * * * * - Executa o comando a cada 15 minutos.
  • */15 * * * * - Executa o comando a cada 15 minutos.
  • 0 4 * * * - Executar o comando todo dia às 4:00 AM.
  • 0 4 * * 2-4 - Executar o comando toda terça-feira, quarta-feira e quinta-feira às 4:00 AM.
  • 20,40 */8 * 7-12 * - Executar o comando no vigésimo e quadragésimo minuto de cada oitava hora, todos os dias dos últimos 6 meses do ano.

Se acha isso tudo um pouco confuso ou se quiser ajuda sobre como escrever os agendamentos de suas próprias tarefas cron, o Cronitor fornece um editor de expressão da agenda do cron bastante útil, chamado “Crontab Guru”, que você pode usar para verificar se seus agendamentos do cron são válidos.

Gerenciando os crontabs

Assim que tiver escolhido uma agenda e souber o trabalho que deseja executar, você precisará colocá-lo em um lugar onde seu daemon consiga lê-lo.

Como mencionado anteriormente, um crontab é um arquivo especial que mantém a agenda de trabalhos que o cron executará. No entanto, esses agendamentos não foram planejados para edição direta. Em vez disso, é recomendável que você utilize o comando crontab. Isso permite que você edite o crontab do perfil do seu usuário sem alterar seus privilégios com o sudo. O comando crontab também revelará se há erros de sintaxe no crontab, ao passo que editá-lo diretamente não revelará.

É possível editar seu crontab com o seguinte comando:

  1. crontab -e

Isso abrirá seu crontab no editor de texto padrão do seu perfil de usuário.

Nota: em novos servidores CentOS 8, por padrão, o comando crontab -e abrirá o crontab do seu usuário com o vi. O vi é um editor de texto extremamente eficaz e flexível; porém, para os usuários que não têm experiência com ele, o vi pode parecer um pouco lento.

Se quiser usar um editor de texto mais acessível como seu editor padrão do crontab, instale e configure o nano como tal.

Para tanto, instale o nano com o dnf:

  1. sudo dnf install nano

Quando solicitado, pressione y e, depois, ENTER para confirmar que deseja instalar o nano.

Para definir o nano como o seu editor visual padrão de perfil de usuário, abra o arquivo .bash_profile para edição. Agora que o instalou, você pod fazer o seguinte com o nano:

  1. nano ~/.bash_profile

No final do arquivo, adicione a seguinte linha:

~/.bash_profile
. . .
export VISUAL="nano"

Isso define a variável de ambiente VISUAL para o nano. A VISUAL é uma variável de ambiente Unix que muitos programas — incluindo o crontab — invocam para editar um arquivo. Após adicionar essa linha, salve e feche o arquivo, pressionando CTRL + X, Y e, depois, ENTER.

Em seguida, recarregue o .bash_profile para que o shell capte a nova mudança:

  1. . ~/.bash_profile

Assim que estiver no editor, você pode preencher sua agenda com cada trabalho em uma nova linha. Caso contrário, você pode salvar e fechar o crontab por enquanto. Se você tiver aberto o seu crontab com o vi - o editor de texto padrão do CentOS 8, você pode salvar e fechar o crontab, pressionando ESC para garantir que esteja no modo de comando do vi. Em seguida, digite :x e pressione ENTER.

Observe que,nos sistemas Linux, há outro crontab armazenado no diretório /etc/. Trata-se de um crontab que abrange o sistema todo e que tem um campo adicional para o perfil de usuário sob o qual cada trabalho do cron deve ser executado. Este tutorial se concentra em crontabs específicos do usuário. Porém, se você quisesse editar o crontab no âmbito do sistema, poderia fazer isso com o seguinte comando:

  1. sudo nano /etc/crontab

Se quiser visualizar o conteúdo do seu crontab, sem editá-lo, você pode usar o seguinte comando:

  1. crontab -l

É possível apagar seu crontab com o seguinte comando:

Aviso: o comando a seguir não irá pedir que você confirme se deseja apagar seu crontab. Apenas execute-o caso tenha certeza de que deseja apagá-lo.

  1. crontab -r

Esse comando excluirá o crontab do usuário imediatamente. No entanto, você pode incluir o sinalizador -i para fazer com que o comando peça para você confirmar se realmente deseja excluir o crontab do usuário:

  1. crontab -r -i
Output
crontab: really delete sammy's crontab?

Quando solicitado, você deve digitar y para excluir o crontab ou n para cancelar a exclusão.

Gerenciando o resultado do trabalho do cron

Como os trabalhos do cron são executados em segundo plano, nem sempre fica aparente se eles foram executados com sucesso. Agora que sabe como usar o comando crontab e como agendar um trabalho do cron, você pode começar a experimentar maneiras diferentes de redirecionar o resultado dos trabalhos do cron para ajudar você a monitorar se eles foram executados com sucesso.

Se tiver um agente de transferência de mensagens — como o Sendmail — instalado e configurado corretamente no seu servidor, você pode enviar o resultado das tarefas do cron para o endereço de e-mail associado ao seu perfil de usuário do Linux. Também é possível especificar manualmente um endereço de e-mail, colocando uma definição MAILTO no topo do crontab.

Por exemplo, você poderia adicionar as linhas a seguir a um crontab. Tais linhas incluem uma instrução MAILTO, seguida de um exemplo de endereço de e-mail, uma diretiva SHELL que indica o shell a executar (bash, neste exemplo), uma diretiva HOME apontando para o caminho no qual procurar o binário do cron e uma única tarefa do cron:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

Esse trabalho em particular retornará “Run this command every minute” (Executar este comando a cada minuto) e tal resultado será enviado por e-mail a cada minuto para o endereço especificado após a diretiva MAILTO.

Também é possível redirecionar o resultado de uma tarefa do cron para um arquivo de registro ou para um local vazio para evitar receber um e-mail com o resultado.

Para anexar o resultado de um comando agendado a um arquivo de registro, adicione >> ao final do comando, seguido do nome e local de um arquivo de registro de sua escolha, como no exemplo abaixo:

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

Vamos supor que você queira usar o cron para executar um script, mas mantê-lo em execução em segundo plano. Para fazer isso, poderia redirecionar o resultado do script para um local vazio, como /dev/null, o que excluirá prontamente quaisquer dados escritos nele. Por exemplo, o trabalho do cron a seguir executa um script PHP em segundo plano:

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

Este trabalho do cron também redireciona o erro padrão — representado por 2 — para o resultado padrão (>&1). Como o resultado padrão já está sendo redirecionado para /dev/null, isso permite essencialmente que o script seja executado silenciosamente. Mesmo se o crontab possuir uma instrução MAILTO, o resultado do comando não será enviado para o endereço de e-mail especificado.

Restringindo o acesso

É possível gerenciar quais usuários têm permissão para usar o comando crontab com os arquivos cron.allow e cron.deny, sendo que ambos ficam armazenados no diretório /etc/. Se o arquivo cron.deny existir, qualquer usuário listado nele estará impedido de editar seu crontab. Se o cron.allow existir, apenas os usuários listados nele poderão editar seus crontabs. Se ambos os arquivos existirem e o mesmo usuário estiver listado em cada um deles, o arquivo cron.allow irá substituir o cron.deny e o usuário conseguirá editar seu crontab.

Por exemplo, para negar acesso a todos os usuários e depois dar acesso ao usuário ishmael, você poderia usar a seguinte sequência de comandos:

  1. sudo echo ALL >>/etc/cron.deny
  2. sudo echo ishmael >>/etc/cron.allow

Primeiro, bloqueamos todos os usuários, anexando ALL ao arquivo cron.deny. Em seguida, ao adicionar o nome de usuário ao arquivo cron.allow, damos acesso ao perfil do usuário ishmael para executar trabalhos do cron.

Note que se um usuário tiver privilégios sudo, ele pode editar o crontab de outro usuário com o seguinte comando:

  1. sudo crontab -u user -e

No entanto, se o cron.deny existir e o usuário estiver listado nele, mas não estiver listado no cron.allow, você receberá o seguinte erro após executar o comando anterior:

Output
The user user cannot use this program (crontab)

Por padrão, a maioria dos daemons cron presumirão que todos os usuários têm acesso ao cron, a menos que o cron.allow ou o cron.deny existirem.

Sintaxe especial

Também existem vários comandos abreviados que você pode usar no seu arquivo crontab para ajudar a simplificar o agendamento de trabalhos. São essencialmente atalhos para o equivalente numérico do agendamento especificado:

Atalho Abreviação para
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

Nota: nem todos os daemons cron podem analisar essa sintaxe (especialmente versões mais antigas); assim, verifique novamente se a sintaxe funciona antes de confiar nela.

Além disso, a abreviação @reboot irá executar qualquer comando que venha depois dela, sempre que o servidor for iniciado:

@reboot echo "System start up"

Usar esses atalhos sempre que possível pode ajudar a facilitar a interpretação do agendamento de tarefas no seu crontab.

Conclusão

O Cron é um utilitário flexível e eficaz, que pode reduzir a carga de trabalho de muitas tarefas associadas à administração do sistema. Quando combinado com scripts de shell, é possível automatizar tarefas que normalmente são tediosas ou complicadas.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Manager, Developer Education

Technical Writer @ DigitalOcean

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
1 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Parabéns, excelente tutorial…

Fiz os passos do tutorial, mas como sou novato em linux fiquei com uma dúvida:

Criei um arquivo backup.sh com o seguinte conteúdo:

#!/bin/bash sqlcmd -S localhost -U SA -P ‘senha_do_banco’ -i “/BKP/Full_Backps.sql” -o “/BKP/Full_Backup.log”

O script executa perfeitamente se eu rodar no terminal “./backup.sh”…

Mas se eu colocar ele na cron dessa forma: “* * * * * /bin/sh /backup.sh” ele não roda… Será q estou errando na sintaxe?

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Featured on Community

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more