Comando cron no Linux (agendamento de tarefas) [Guia Básico]

O comando cron no Linux é um serviço que provê o serviço de agendamento de tarefas para os usuários e o sistema. 

Ele permite que um comando, programa ou script seja agendado para um determinado dia, mês, ano e hora. É muito usado em tarefas que precisam ser executadas a cada hora, dia ou qualquer outro período, de forma recorrente.

Geralmente o cron é utilizado para executar arquivamento de logs e checagem da integridade do sistema e outras manutenções periódicas.

As tarefas do sistema que serão executadas são definidas no arquivo /etc/crontab.

Cada usuário também pode ter suas tarefasconfiguradas em arquivos individuais no diretório /var/spool/cron/ com o login da conta do usuário.

O cron possui um utilitário chamado crontab que facilita a visualização e edição dos arquivos do cron.

Para agendar uma nova tarefa, podemos utilizar o comando crontab ou editarmos o arquivo /etc/crontab com qualquer editor de texto e definir quando a tarefa será executada.

O formato que o arquivo de cron usa é:

MINUTOS HORAS DIA MES SEMANA USUARIO COMANDO
cron_pt Comando cron no Linux (agendamento de tarefas) [Guia Básico]Formato do Crontab

Não é necessário reiniciar o serviço do cron porque ele verifica seus arquivos a cada minuto.

O formato de um arquivo crontab segue a seguinte ordem:

Os valores para cada campo podem ser:

Minuto: Valor entre 0 e 59;
Hora: Valor entre 0 e 23; 
Dia do Mês: Valor entre 1 e 31; 
Mês: Valor entre 1 e 12 (identificando os meses de janeiro a dezembro); 
Dia da Semana: Valor entre 0 e 7, sendo que zero ou sete são usados para identificar o domingo. 
Login do Usuário: O usuário que será usado para executar o comando;
Comando: Programa que será executado, mais seus parâmetros normais. 

Cada campo deve ser separado por um ou mais espaços ou tabulações.

O símbolo asterisco “*” pode ser usado para indicar que qualquer data ou hora são válidas. Também é possível especificar intervalos de tempo usando a barra “/”. Exemplo “*/5” no campo minutos indica que o comando deve rodar a cada 5 minutos.

É possível especificar intervalos para que o comando seja executado através do hífen “”, indicando os períodos de execução incluindo o número inicial e final.

Uma lista de horas e datas pode ser feita utilizando a vírgula  “,” para separar os valores. 

Veja alguns exemplos de cron:

Executa o comando sync todo o dia as 10:00:

0   10   *   *   *   root   sync

Executa o comando updatedb toda segunda-feira às 06:00:

0   6   *   *   1   root   updatedb

Executa o comando runq todos os dias a cada vinte minutos:

0,20,40   *   *   *   *   root   runq

Envia um e-mail as 0:15 todos os natais para a carla:

15   0   25   12   *   root   mail carla < natal.txt

Executa o comando poff às 5:30 de segunda à sábado:

30    5   *   *   1-6   root   poff

Executa um script PHP a cada 5 minutos:

*/5   *   *   *   *   root   /usr/bin/php -c /etc/php.ini /home/script.php

Arquivo crontab

O comando crontab comando facilita a edição dos arquivos de configuração do cron. Ele é útil para edição dos arquivos dos usuários localizados em /var/spool/cron/

O crontab salva o arquivo individual do cron com o nome do login do usuário.

Este arquivo tem o mesmo formato do /etc/crontab exceto por não possuir o campo usuário (UID), uma vez que nome do arquivo já tem esta identificação. 

# ls –l /var/spool/cron/tabs
-rw——— 1 root root 264 Jun 20 14:36 root
-rw——— 1 root users 199 Jun 20 15:58 uira

As opções mais frequentes do crontab são:

  • -e: Edita o arquivo de cron utilizando o editor vi.
  • -l: Lista o conteúdo do arquivo de cron do usuário corrente
  • -r: Remove o arquivo de cron.
  • -u usuário: Realiza uma das operações como se fosse um determinado usuário. Deve ser usada em conjunto com as outras opções e somente o root pode alterar o cron de outros usuários.

Veja os exemplos:

Neste exemplo o comando “/usr/bin/mrtg /etc/mrtg.cfg” é executado a cada 5 minutos e o “/bin/sendip.sh” todos os dias à 01:00am:

$ crontab –l
*/5 * * * * /usr/bin/mrtg /etc/mrtg.cfg
0 1 * * * /bin/sendip.sh

Para agendar alguma tarefa no cron, utilize o “crontab –e” para editar o arquivo com o vi:

$ crontab -e

Inclua uma linha em branco no final do arquivo, caso contrário o último comando não será executado. 

Permissões do Cron

O cron possui dois arquivos que habilitam ou desabilitam o seu uso pelos usuários. Dependendo da distribuição, eles podem ter nomes e lugares diferentes. São eles:

/etc/cron.allow

Se o arquivo cron.allow existir, um determinado usuário precisa ter seu login listado no seu conteúdo para ter permissões expressas para o uso do cron.

/etc/cron.deny

Se o arquivo cron.deny existir, os logins listados em seu conteúdo são proibidos de utilizar o cron. Os demais usuários poderão usar o cron.

Se nenhum dos dois arquivos existirem, o uso do cron será permitido para todos os usuários. Se o arquivo cron.deny estiver vazio, todos os usuários terão permissão de usar o cron.

Diretórios Especiais do Cron

/etc/cron.d

O cron também conta com um diretório especial em /etc/cron.d. Este diretório pode conter os arquivos:

  • daily: especifica quais comandos são executados diariamente;
  • hourly: especifica quais comandos são executados de hora em hora;
  • weekly: especifica quais comandos são executados toda semana;
  • monthly: especifica quais comandos são executados todos os meses.

Os arquivos contidos neste diretório deve seguir o formado do /etc/crontab:

# cat /etc/cron.d/sysstat 
*/10 * * * * root /usr/lib64/sa/sa1 1 1
53 23 * * * root /usr/lib64/sa/sa2 -A

Todos os scripts ou comandos executados são sob a permissão do usuário root.

Os arquivos em /etc/cron.d costumam ter seu nome precedido de um número inteiro maior que zero para ordenar a sua execução

/etc/cron.{daily, hourly, weekly, monthly}

Outras possibilidades que o cron examina são os diretórios /etc/cron.daily/etc/cron.hourly/etc/cron.weekly e /etc/cron.monthly.

Estes diretórios podem conter scripts que serão executados nos intervalos de tempo que cada nome de arquivo especifica.

# ls -l /etc/cron.daily/
-rwx------. 1 root root 219 Apr 10  2018 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Apr 10  2018 mlocate

Nestes diretórios os arquivos devem conter scripts com comandos que serão executados, e não um agendamento do que será executado como no crontab.

Veja o exemplo do script logrotate:

$ cat /etc/cron.daily/logrotate 
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
exit 0

Outro detalhe importante: os scripts em /etc/cron.{daily, hourly, weekly, monthly} precisam estar com a permissão executável “X” habilitada.

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe