Tutorial

Como usar o Cron para automatizar tarefas no Ubuntu 18.04

System ToolsUbuntu 18.04

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 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.

Pré-requisitos

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.

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 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
Output
Synchronizing 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.

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/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.

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:

  • 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:

Output
no 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
Output
crontab: really delete sammy's crontab? (y/n)

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 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.

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 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:

Output
The 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.

Sintaxe especial

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.

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. 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.

0 Comments

Creative Commons License