Cron no Linux: como agendar tarefas

O Cron é uma ferramenta que tem a função de agendar tarefas. É nativo do sistema operacional Unix, principalmente das distribuições Linux. O Cron no Linux se baseia no tempo para executar as tarefas que nele forem configuradas.

As tarefas agendadas, também conhecidas como cron jobs, são executadas de forma automática. Elas fazem do cron uma ferramenta muito útil para automatizar trabalhos rotineiros. Estes ocupam muito tempo ou exigem um horário específico para sua execução.

Neste artigo, você terá uma visão ampla sobre o agendamento de tarefas e como usar a sintaxe do cron.

Além disso, inclui formas mais ágeis de agendar as tarefas, deixando a sua compreensão mais fácil.

Como instalar o Cron no Linux

Para os exemplos práticos deste artigo faremos uso do Ubuntu. Mas, você poderá utilizar outra distribuição de sua preferência, porém, alguns comandos do Linux poderão ser um pouco diferentes.

Contudo, você deverá utilizar um usuário com permissão de super usuário (comando sudo).

Essa é mais uma ferramenta que vem instalada por padrão em praticamente todas as distribuições Linux, como, por exemplo, nos servidores VPS Homehost. No entanto, se você usar alguma máquina em que o cron não estiver instalado, poderá usar o utilitário APT para isso.

Vamos iniciar a parte prática atualizando os índices de pacotes do Linux. Dessa forma, você pode começar executando o comando abaixo.

Em distribuições CentOS:

sudo yum update

Em distribuições Ubuntu:

$ sudo apt update
apt update pra instalar a cron no linux

Então, você deve aplicar o upgrade de pacotes que a atualização de índices trouxe:

$ sudo apt upgrade

Será o momento de você instalar o cron no Linux:

Em distruições CentOS:

$ sudo yum install cron

Em distribuições Ubuntu:

$ sudo apt install cron
apt install cron pra instalar a cron no linux

Mas, se já estiver instalado, a saída retornada será semelhante acima.

O cron é um serviço que roda em segundo plano no sistema operacional. Então, você terá que habilitá-lo para certificar que isso realmente aconteça:

$ sudo systemctl enable cron
systemctl enable cron

Após isso, o cron estará pronto para que você possa utilizá-lo.

Como funciona a estrutura do Cron no Linux

As tarefas cron são registradas e administradas através de um arquivo considerado como tabela, chamado de crontab.

Se a máquina possui mais de um perfil de usuário, cada usuário que logar no sistema pode ter suas próprias tarefas agendadas. Logo, cada usuário pode administrar seu crontab.

O caminho padrão para administrar as tabelas fica armazenado em /var/spool/cron/crontabs/.

Então, para que você possa agendar uma tarefa cron, abra o arquivo crontab com um editor de texto e adicione a tarefa desejada.

Você precisa escrever os trabalhos em forma de expressões cron. A sintaxe das expressões cron possui duas partes:

A primeira indica o agendamento e a segunda concentra o comando que o daemon deve executar .

A parte de comando contém um comando seguido de um script ou url que normalmente executaríamos manualmente.

A parte de agendamento na sintaxe se divide em 5 campos diferentes, que descritos na seguinte ordem:

CampoValores permitidos
minuto0-59
hora0-23
Dia do mês1-31
mês1-12 ou JAN-DEC
Dia da semana0-6 ou SUN-SAT

De forma agrupada, as duas partes das tarefas agendadas no crontab ficam estruturadas dessa forma:

[minuto] [hora] [dia do mês] [mês] [dia da semana] [comando para rodar na tarefa]

Exemplos de uso do Cron no Linux

Logo abaixo, um exemplo de sintaxe de tarefa cron funcional. A sintaxe em questão executa o comando curl na url https://www.homehost.com.br/ todo domingo às 21h30:

30 21 * * 0 curl https://www.homehost.com.br

Há caracteres que você pode utilizar na sintaxe de uma tarefa cron para facilitar o agendamento:

*: O asterisco tem a função de ser carácter coringa. Quando usado, representa “todos”.

Sendo assim, se você inserir * em todos os componentes de agendamento. Então, a tarefa se executará a todo minuto, todas as horas, todos os dias, todos os meses.

,: O uso de vírgula tem a função de formar uma lista quando desejamos executar a mesma tarefa em um intervalo fracionado.

Se você precisa executar uma tarefa no começo e no meio de cada hora, não precisa criar duas tarefas com agendamentos distintos. Por exemplo, 0 * * * * para a primeira e 30 * * * * para a segunda. Você obtém o mesmo resultado com apenas uma (ficando dessa forma 0,30 * * * *).

: O hífen permite o uso de intervalos no agendamento. Caso você tenha um agendamento para que se execute a todos os 30 primeiros minutos de cada hora, basta usar 0-29 * * * * ….

/: Usada em conjunto com o asterisco, a barra serve para expressar um valor por etapa.

Por exemplo, você pode agendar uma tarefa que se execute a cada 3 horas, apenas usando 0 */3 * * *

Isso elimina a necessidade de escrever oito tarefas separadas para o mesmo comando.

Observação: Somente use números inteiros e que dividam o valor total do campo de modo uniforme. Como no campo “horas”, você deve usar a barra com 1, 2, 3, 4, 6, 8 ou 12, pois são números que dividem as 24 horas sem sobras.

Outros exemplos de uso do Cron no Linux

20 * * * * – Execute o comando 20 minutos após cada hora.

0,15,30,45 * * * * – O comando será executado a cada 15 minutos.

*/15 * * * * – Parecido com o exemplo acima, o comando será executado a cada 15 minutos.

0 6 * * * – A tarefa será executada diariamente às 6h.

0 2 * * 2-4 – A execução da tarefa ocorre todas as terças, quartas e quintas-feiras às 2h.

20,40 */8 * 7-12 * – O comando será executado no minuto 20 e no minuto 40 a cada 8 horas. Diariamente nos últimos 6 meses do ano.

Administrando Crontabs no Linux

O Crontab é um arquivo especial em que se concentram os agendamentos dos cronjobs que serão executados.

Se você precisar editar alguma tarefa, deverá usar o comando crontab para isso.

Com este comando você edita as tarefas cron apenas em seu perfil de usuário crontab. Além disso, o comando crontab é capaz de reportar se houver erro em sintaxe.

Para editar o arquivo crontab, execute o seguinte comando:

$ crontab -e

Quando você executa o comando crontab -e pela primeira vez, uma solicitação para selecionar um editor de texto surge.

Saída:

crontab -e pra editar a cron no linux

Tecle Enter para aceitar a opção 1 padrão ou digite o número que corresponde ao editor de sua preferência.

Após você selecionar o editor, ele abrirá um novo crontab com instruções referentes ao seu uso. O documento terá esse mesmo conteúdo:

editando o cron

Então, nas demais ocasiões em que você executar “crontab -e” , o editor escolhido abrirá o arquivo crontab.

Uma vez com o editor aberto, você pode inserir os agendamentos de tarefas desejados, um por linha, e salvar as alterações ao sair.

Observação: Nas distribuições Linux há outro crontab contido em /etc/. Este outro crontab é conhecido como system-wide crontab . Ele possui um campo adicional no qual o usuário cron é quem deve executar cada tarefa.

Caso você precise editar este outro crontab, execute o comando:

$ sudo vim /etc/crontab
crontab configuracao

Conforme você pode perceber, neste arquivo crontab há todas as instruções necessárias para seu uso. Algumas instruções são idênticas ao que já aprendemos até aqui.

Para você apenas exibir o conteúdo do crontab, porém, sem editá-lo, execute o comando:

$ crontab -l
crontab -l

Como não possuímos tarefas agendadas ainda, a mensagem acima aparece.

Removendo Tarefas Cron

Você pode deletar o crontab com o seguinte comando:

$ crontab -r

Após rodar o comando, valide a deleção:

crontab -r e crontab -l

Mas atenção, este comando irá deletar o conteúdo do crontab sem pedir confirmação a você. Somente o use se de fato tiver certeza da deleção.

Porém, você pode executar o comando para exclusão de uma forma mais segura. Basta acrescentar o parâmetro -i ao comando e ao executá-lo solicita-se a confirmação se de fato quer concluir a exclusão.

$ crontab -r -i

Saída:

deletar a cron no linux

Para remover o agendamento, você deve digitar y ou n para cancelar a exclusão.

Administrando a Saída do Cron no Linux

Como as tarefas cron rodam em segundo plano, nem sempre conseguimos confirmação se foram executadas com sucesso ou não.

Porém, há métodos que auxiliam a ter um controle sobre a execução das tarefas.

Utilize ferramentas adicionais que redirecionem a saída das tarefas cron para acompanhar quando for ou não executadas com sucesso.

Sugestão 1

Por exemplo, você pode configurar um serviço de e-mail no servidor. Assim pode utilizá-lo para enviar as saídas das tarefas cron para o endereço de email.

Uma alternativa será inserir seu endereço de e-mail, junto com um campo MAILTO na parte superior do arquivo crontab.

Na linha seguinte, após ao MAILTO, inclua uma diretiva SHELL que aponte para o shell que será executado (o bash neste caso).

Então, finalizando a configuração, na terceira linha deve conter a diretiva HOME. Ela deve apontar para o local no qual procurar o binário do cron . Na quarta linha insira uma única tarefa cron, ficando semelhante a essa configuração:

MAILTO="homehost@homehost.com.br"

SHELL=/bin/bash

HOME=/

* * * * * echo ‘Tarefa sendo executada a cada minuto’

Essa tarefa em questão retornará “Tarefa sendo executada a cada minuto”. Então, este retorno é enviado por e-mail a todo minuto para o endereço de e-mail indicado na diretiva MAILTO.

Sugestão 2

Uma outra solução que você poderá implementar é redirecionar as saídas da tarefa cron para um arquivo ou local vazio.

Para tanto, inclua dois símbolos de maior “>>” no fim do comando, seguido pela localização do arquivo de sua preferência, ficando semelhante a:

* * * * * echo ‘Tarefa sendo executada a cada minuto’

>> /var/log/tarefas.log

É possível executar um script através do cron e mantê-lo em execução em segundo plano. Dessa forma, você pode configurar a tarefa para redirecionar a saída do script para um local vazio. Por exemplo, para /dev/null o que exclui todos os dados gravados nele.

Por exemplo, a tarefa cron a seguir executa um script PHP em segundo plano:

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

O número 2 representa o erro padrão encaminhado para a saída, representado pelo número 1.

Como a saída padrão já redireciona para /dev/null, isso basicamente permite que o script rode sem exibir dados.

A saída continuará sendo silenciosa neste cenário, mesmo que no crontab tenha a diretiva MAILTO.

Restringindo acesso

Você pode controlar quais usuários terão permissão para uso da ferramenta crontab.

Os arquivos cron.allow e cron.deny, são responsáveis por permitir ou negar essa permissão, respectivamente. E a localização deles costuma ser em /etc/.

Então, qualquer usuário incluso em cron.deny ficará impedido de editar os arquivos crontab.

Se o usuário estiver incluso em cron.allow, poderá editar os crontabs normalmente.

Porém, se o mesmo usuário estiver incluso em ambos os arquivos, o cron.allow terá maior poder do que cron.denye, permitindo que o usuário edite seus crontab.

Por exemplo, para permitir que apenas o usuário suport tenha acesso ao crontab, você pode inserir a seguinte sequência de configuração. Os demais ficarão bloqueados.

sudo echo ALL >>/etc/cron.deny

sudo echo suport >>/etc/cron.allow

Observação: é possível ver o aviso Permission denied ao tentar rodar os comandos acima. Para solucionar, use o usuário root, em seguida, poderá usar seu usuário para editar estes arquivos quando precisar.

Ao incluirmos a instrução ALL no arquivo cron.deny, bloqueamos todos os usuários.

E ao incluirmos o usuário suport no arquivo cron.allow, concedemos permissão ao usuário suport para execução de tarefas cron, mesmo que em cron.deny esteja definido bloqueio para todos (ALL).

Um usuário que tenha privilégio de sudo possui acesso para editar arquivo crontab de outro usuário, utilizando o comando em questão:

$ sudo crontab -u usuário -e

Porém, se este usuário com privilégio com sudo estiver listado em cron.deny mas não está listado em cron.allow, o seguinte erro após executar o comando retornará:

The user user cannot use this program (crontab)

Sintaxes Especiais

Os daemons do cron possuem atalhos de vários comandos que você pode inserir no arquivo crontab para facilitar os agendamentos.

Estes são atalhos referentes ao cronograma numérico já apresentado:

AtalhoAbreviatura para
@hourly0 * * * *
@daily0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly0 0 1 1 *

Nota : Estes atalhos são reconhecidos pelas atuais versões dos daemos do cron. Portanto, ao utilizar versões antigas de distribuições Linux, faça testes para confirmar se os atalhos funcionam.

Além disso, existe a sintaxe @reboot, que executará qualquer comando que a seguir sempre que o servidor for iniciado:

@reboot echo "System start up"

O uso desses atalhos facilita na interpretação do cronograma das tarefas no arquivo crontab.

Considerações finais

Enfim, o cron no Linux é uma ferramenta bastante poderosa e flexível. Ele ajuda muito na redução de várias tarefas cotidianas na administração do Linux.

Principalmente quando combinado com scripts em shell, você será capaz de automatizar tarefas que normalmente são maçantes, como as populares rotinas de backup.

Este artigo foi útil?

Obrigado pela resposta!
Marcio S

Marcio S

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!