Shaun Lewis escreveu uma versão anterior deste tutorial.
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 as 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.
Para completar este guia, você precisará de acesso a um computador executando o Ubuntu 18.04. Esse equipamento pode ser seu computador local, uma máquina virtual, ou um servidor privado virtual.
Independentemente do tipo de computador que você usar para acompanhar este guia, ele deve possuir um usuário não raiz com privilégios administrativos configurados. Para configurar isso, siga nosso guia Configuração inicial de servidor para o Ubuntu 18.04.
Por padrão, quase toda distribuição do Linux tem alguma forma do cron instalada. No entanto, se estiver usando uma máquina com Ubuntu na qual o cron não estiver instalado, instale-o usando a APT.
Antes de instalar o cron em uma máquina com Ubuntu, atualize o índice de pacotes local do computador:
- sudo apt update
Depois, instale o cron com o seguinte comando:
- sudo apt install cron
Você precisará garantir que ele também esteja configurado para executar em segundo plano:
- sudo systemctl enable cron
OutputSynchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable cron
Em seguida, o cron estará instalado no seu sistema e pronto para que você comece a agendar trabalhos.
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/crontabs/
.
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 das expressões cron pode ser desdobrada 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 para 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 da agenda 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 fragmentam os valores do agendamento para formarem 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 uniforma no intervalo permitido pelo campo em questão. Por exemplo, após campo “horas” você só poderia usar uma barra com 1
, 2
, 3
, 4
, 6
, 8
ou 12
.
Apresentamos a seguir, outros exemplos de como usar o componente de agendamento do cron:
* * * * *
- Executar o comando a cada minuto.12 * * * *
- Executar o comando 12 minutos após cada hora.0,15,30,45 * * * *
- Executar o comando a cada 15 minutos.*/15 * * * *
- Executar 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.
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:
- crontab -e
Se essa for a primeira vez que executa o comando crontab
no perfil desse usuário, você será solicitado a escolher um editor de texto padrão para usar ao editar seu crontab:
Outputno crontab for sammy - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
Digite o número que corresponde ao editor de sua escolha. Como alternativa, você pode simplesmente pressionar ENTER
para aceitar a opção padrão, o nano
.
Após fazer sua escolha, você será levado para um novo crontab contendo algumas instruções com comentários sobre como usá-lo:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
Quando executar o crontab -e
no futuro, ele irá trazer seu crontab neste editor de texto automaticamente. 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 (CTRL + X
, Y
, então ENTER
- se tiver escolhido o editor nano
).
Nota: em 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:
- sudo nano /etc/crontab
Se quiser visualizar o conteúdo do seu crontab, mas não editá-lo, utilize o seguinte comando:
- 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.
- 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:
- crontab -r -i
Outputcrontab: really delete sammy's crontab? (y/n)
Quando solicitado, você deve digitar y
para excluir o crontab ou n
para cancelar a exclusão.
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 e-mail — 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ê quer 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
Esse 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.
É 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 será 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:
- sudo echo ALL >>/etc/cron.deny
- 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:
- 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:
OutputThe user user cannot use this program (crontab)
Por padrão, a maioria dos daemons do cron presumirão que todos os usuários têm acesso ao cron, a menos que o cron.allow
ou o cron.deny
exista.
Também existem vários comandos abreviados que você pode usar no seu arquivo do 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 do cron podem analisar essa sintaxe (especialmente versões mais antigas); então, verifique novamente se ela 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.
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. Por exemplo, você poderia escrever um script de shell para enviar backups de dados para uma solução de armazenamento de objetos e, depois, automatizá-lo com o cron.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
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!