Manager, Developer Education
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 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 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.
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:
- sudo dnf update
Então, instale o daemon cron com o seguinte comando:
- 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:
- sudo systemctl start crond.service
Para definir o cron para executar sempre que o servidor for iniciado, digite:
- sudo systemctl enable crond.service
Depois disso, o cron estará instalado no seu sistema, 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/
.
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.
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
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 comand
o 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
:
- 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
:
- nano ~/.bash_profile
No final do arquivo, adicione a seguinte linha:
. . .
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:
- . ~/.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:
- sudo nano /etc/crontab
Se quiser visualizar o conteúdo do seu crontab, sem editá-lo, você pode usar 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?
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 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.
É 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:
- 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 cron presumirão que todos os usuários têm acesso ao cron, a menos que o cron.allow
ou o cron.deny
existirem.
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.
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.
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?