15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
24.10.2024
1 +1

Como Exibir e Listar Cron Jobs Usando o Crontab

O comando crontab é a interface principal para visualizar, editar e gerir tarefas agendadas no sistema cron Unix. Para listar todos os cron jobs do utilizador atualmente autenticado, execute crontab -l em qualquer terminal. Para jobs de root ou de todo o sistema, inspecione /etc/crontab, /etc/cron.d/ e /var/spool/cron/crontabs/ diretamente.

O Cron é a espinha dorsal da automatização de tarefas em sistemas Linux e Unix. Quer esteja a executar dumps de base de dados noturnos num ambiente de VPS Hosting, a rodar logs num Servidor Dedicado, ou a renovar Certificados SSL automaticamente via Certbot, compreender como auditar e listar todas as tarefas agendadas numa máquina é uma competência indispensável para qualquer administrador de sistemas. Este guia abrange todas as camadas da pilha cron — crontabs de utilizador, crontabs do sistema, diretórios drop-in e o spool — juntamente com armadilhas do mundo real que enganam até engenheiros experientes.

O Que É o Crontab e Como Funciona o Sistema Cron

Crontab (abreviatura de “cron table”) é um ficheiro de configuração por utilizador que instrui o daemon crond sobre quais comandos executar e quando. Cada conta de utilizador num sistema — incluindo root — pode manter um crontab independente. O daemon lê estes ficheiros no arranque e após qualquer edição, e depois despacha os jobs de acordo com as suas especificações de tempo.

O ecossistema cron numa distribuição Linux moderna consiste em várias camadas distintas:

  • Crontabs de utilizador — geridos via crontab -e e armazenados em /var/spool/cron/crontabs/ (Debian/Ubuntu) ou /var/spool/cron/ (RHEL/CentOS)
  • Crontab do sistema — o ficheiro /etc/crontab, que inclui um campo extra user por entrada
  • Diretório drop-in/etc/cron.d/, onde os pacotes instalam as suas próprias definições de jobs
  • Diretórios run-parts/etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/, que contêm scripts executáveis em vez de ficheiros com sintaxe crontab
  • Anacron — um complemento ao cron que trata de jobs em máquinas que não estão em funcionamento 24/7, lendo a partir de /etc/anacrontab

Compreender em que camada um job reside é fundamental ao auditar um servidor, porque crontab -l por si só irá ignorar a maioria das tarefas agendadas num sistema de produção típico.

Sintaxe dos Campos de Tempo do Crontab

Cada entrada do crontab segue uma especificação de tempo fixa de cinco campos antes do comando:

* * * * *  command_to_execute
| | | | |
| | | | +----- day of the week  (0–7, Sunday = 0 or 7)
| | | +------- month            (1–12)
| | +--------- day of the month (1–31)
| +----------- hour             (0–23)
+------------- minute           (0–59)

Atalhos de sintaxe especiais suportados pela maioria das implementações cron:

AtalhoEquivalenteSignificado
@rebootExecutar uma vez no arranque do daemon
@yearly0 0 1 1 *Uma vez por ano
@monthly0 0 1 * *Primeiro dia de cada mês
@weekly0 0 * * 0Todos os domingos à meia-noite
@daily0 0 * * *Todos os dias à meia-noite
@hourly0 * * * *No início de cada hora

Os ficheiros /etc/crontab e /etc/cron.d/ adicionam um sexto campo — o nome de utilizador sob o qual o comando é executado — entre a especificação de tempo e o próprio comando.

Como Listar Cron Jobs: Todos os Métodos Explicados

1. Visualizar os Seus Próprios Cron Jobs de Utilizador

crontab -l

Isto imprime o crontab do utilizador que executa o comando. Se ainda não existir nenhum crontab, verá uma saída em branco ou a mensagem no crontab for <username> — ambas são normais.

Exemplo de saída:

# m  h   dom mon dow  command
0    0   *   *   *    /home/deploy/backup.sh
30   2   *   *   7    /home/deploy/scripts/cleanup.sh
15   */4 *   *   *    /usr/local/bin/health-check.sh >> /var/log/health.log 2>&1

Neste exemplo:

  • backup.sh é executado todos os dias à meia-noite
  • cleanup.sh é executado todos os domingos às 02:30
  • health-check.sh é executado a cada quatro horas a partir das 00:15, com stdout e stderr redirecionados para um ficheiro de log

Armadilha: O redirecionamento de saída (>>, 2>&1) é frequentemente omitido nas entradas do crontab. Sem ele, o cron tenta enviar a saída por email ao utilizador local via sendmail. Em servidores sem um agente de transferência de correio, isto descarta silenciosamente toda a saída e torna a depuração quase impossível. Redirecione sempre a saída ou defina MAILTO="" no topo do crontab.

2. Listar Cron Jobs de Outro Utilizador

Com sudo ou acesso root, pode inspecionar o crontab de qualquer utilizador:

sudo crontab -l -u john

Substitua john pelo nome de utilizador pretendido. Isto é funcionalmente idêntico a ler o ficheiro de spool bruto, mas utiliza o mecanismo de bloqueio adequado, pelo que é sempre preferível ao acesso direto ao ficheiro.

3. Listar Todos os Crontabs de Utilizadores de Uma Vez

Num servidor multiutilizador, iterar sobre cada conta é a única forma fiável de obter uma visão completa:

for user in $(cut -f1 -d: /etc/passwd); do
    echo "=== Crontab for: $user ==="
    sudo crontab -l -u "$user" 2>/dev/null
done

O 2>/dev/null suprime as mensagens “no crontab for” para utilizadores que não têm nenhum, mantendo a saída limpa.

4. Visualizar o Crontab de Todo o Sistema

cat /etc/crontab

Uma saída típica num sistema baseado em Debian:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow  user     command
17  *  *   *   *    root     cd / && run-parts --report /etc/cron.hourly
25  6  *   *   *    root     test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47  6  *   *   7    root     test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52  6  1   *   *    root     test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Note a proteção test -x /usr/sbin/anacron: se o anacron estiver instalado, estas chamadas run-parts são ignoradas e o anacron assume a responsabilidade pelos jobs diários, semanais e mensais. Esta é uma fonte comum de confusão quando os jobs parecem não ser executados no horário previsto.

5. Listar Jobs em /etc/cron.d/

ls -la /etc/cron.d/

Para inspecionar o conteúdo de cada ficheiro no diretório numa única passagem:

grep -v '^#|^$' /etc/cron.d/*

Isto remove linhas de comentários e linhas em branco, mostrando apenas definições de jobs ativas. Os gestores de pacotes frequentemente colocam ficheiros aqui — exemplos comuns incluem sysstat, substituições logrotate e agentes de monitorização.

6. Inspecionar o Diretório de Spool do Cron Diretamente

ls -la /var/spool/cron/crontabs/

No RHEL, CentOS e Fedora, o caminho é /var/spool/cron/ sem o subdiretório crontabs. Para ler o ficheiro de spool bruto de um utilizador específico:

sudo cat /var/spool/cron/crontabs/username

Importante: Nunca edite ficheiros de spool diretamente com um editor de texto. O comando crontab -e utiliza bloqueio de ficheiros e valida a sintaxe antes de instalar o novo ficheiro. Edições diretas podem corromper o ficheiro ou deixá-lo num estado em que crond o ignora completamente.

7. Listar Jobs do Anacron

Se o sistema utiliza anacron para agendamento resiliente:

cat /etc/anacrontab

As entradas do Anacron utilizam uma sintaxe diferente — período em dias, atraso em minutos, identificador do job e comando — em vez do formato cron padrão de cinco campos.

8. Verificar Temporizadores Systemd (Alternativa Moderna)

Nas distribuições baseadas em systemd, muitas tarefas que eram historicamente geridas pelo cron são agora tratadas por temporizadores systemd. Estes não aparecerão em nenhuma listagem de crontab:

systemctl list-timers --all

Uma auditoria completa do servidor deve incluir verificações tanto do cron como dos temporizadores systemd. Não o fazer é uma das lacunas mais comuns em revisões de segurança e conformidade.

Auditoria Completa do Cron: Comando Único

Para uma auditoria rápida e abrangente de todas as tarefas agendadas num sistema, combine todas as fontes:

echo "=== /etc/crontab ===" && cat /etc/crontab
echo "=== /etc/cron.d/ ===" && ls /etc/cron.d/ && grep -rh '' /etc/cron.d/
echo "=== User crontabs ===" && for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null && echo "  ^ user: $u"; done
echo "=== Systemd timers ===" && systemctl list-timers --all --no-pager

Editar e Gerir Cron Jobs

Para abrir o seu próprio crontab no editor padrão do sistema ($VISUAL ou $EDITOR, com recurso a vi):

crontab -e

Para editar o crontab de outro utilizador como root:

sudo crontab -e -u username

Para remover todos os cron jobs do utilizador atual (utilize com cuidado — isto é irreversível sem uma cópia de segurança):

crontab -r

Para fazer uma cópia de segurança de um crontab antes de fazer alterações:

crontab -l > ~/crontab_backup_$(date +%F).txt

Faça sempre uma cópia de segurança antes de editar. Não existe desfazer incorporado no crontab -e.

Cron vs. Temporizadores Systemd: Comparação de Funcionalidades

FuncionalidadeCronTemporizadores Systemd
Formato de configuraçãoTexto simples, sintaxe de cinco camposFicheiros de unidade (.timer + .service)
Agendamento por utilizadorSim, via crontabs de utilizadorSim, via instâncias systemd ao nível do utilizador
Tratamento de jobs perdidosNão (o job é ignorado se o sistema estiver desligado)Sim, com Persistent=true
RegistoSyslog / correioJournald (consultável com journalctl)
Gestão de dependênciasNenhumaGrafo completo de dependências systemd
Atraso aleatórioNão nativo (requer sleep $RANDOM)RandomizedDelaySec=
ComplexidadeBaixaModerada
DisponibilidadeTodos os sistemas Unix/LinuxApenas Linux baseado em systemd

Para automatização simples baseada em tempo em qualquer sistema Unix — incluindo ambientes legados e contentores — o cron continua a ser a escolha mais portátil e operacionalmente simples. Os temporizadores systemd são superiores quando necessita de ordenação de dependências, execução fiável de jobs perdidos ou saída de log estruturada.

Comandos Comuns de Listagem do Crontab: Referência Rápida

ObjetivoComando
Listar jobs do utilizador atualcrontab -l
Listar jobs de outro utilizadorsudo crontab -l -u username
Listar jobs de todos os utilizadoresfor u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done
Ver crontab do sistemacat /etc/crontab
Listar jobs do cron.dls /etc/cron.d/
Ver diretório de spoolls /var/spool/cron/crontabs/
Ver jobs do anacroncat /etc/anacrontab
Listar temporizadores systemdsystemctl list-timers --all
Editar crontab do utilizador atualcrontab -e
Remover crontab do utilizador atualcrontab -r

Armadilhas do Mundo Real e Casos Extremos

As variáveis de ambiente não são herdadas. O Cron executa jobs num ambiente de shell mínimo. Variáveis como PATH, HOME e LANG que estão definidas no seu .bashrc ou .profile não estão disponíveis. Utilize sempre caminhos absolutos para comandos e binários, ou defina explicitamente PATH no topo do crontab.

A variável MAILTO controla o encaminhamento da saída. Defina MAILTO="" para descartar a saída, ou MAILTO="admin@example.com" para encaminhá-la para um endereço específico. Sem um MTA configurado, a saída não tratada causa falhas silenciosas.

As permissões nos scripts são importantes. Um script que funciona bem de forma interativa pode falhar no cron se não for executável (chmod +x) ou se referenciar ficheiros que o utilizador cron não consegue ler.

Execução sobreposta de jobs. Se um job demorar mais do que o seu intervalo, várias instâncias serão executadas em simultâneo. Utilize um ficheiro de bloqueio ou flock para evitar isto:

0 * * * * /usr/bin/flock -n /tmp/myjob.lock /home/user/long-running-job.sh

Consciência do fuso horário. O Cron utiliza o fuso horário do sistema por padrão. Em servidores com UTC definido como relógio do sistema — o que é prática padrão em VPS Hosting e Servidores Dedicados — certifique-se de que os seus horários agendados têm em conta o desvio. Algumas implementações cron suportam uma variável CRON_TZ por crontab.

Validação da sintaxe do crontab. Antes de implementar uma nova entrada de crontab em produção, valide a expressão utilizando uma ferramenta como crontab.guru para confirmar que o agendamento corresponde à sua intenção.

Registo e Depuração de Cron Jobs

Por padrão, o cron regista a execução dos jobs no syslog. Para ver a atividade recente do cron:

grep CRON /var/log/syslog | tail -50

Em sistemas baseados em systemd:

journalctl -u cron --since "1 hour ago"

Se um job não estiver a ser executado, verifique:

  1. O daemon cron está ativo: systemctl status cron (ou crond em sistemas baseados em RHEL)
  2. O script é executável e o caminho está correto
  3. Os campos de tempo são sintaticamente válidos
  4. A saída não está a ser silenciosamente descartada — adicione >> /tmp/job.log 2>&1 temporariamente
  5. O utilizador que executa o job tem permissão para executar o comando

Ao gerir pilhas de automatização complexas num VPS com cPanel, o cPanel fornece uma interface gráfica de Cron Jobs na secção Avançado, que escreve diretamente no crontab do utilizador. Os jobs adicionados via cPanel são totalmente visíveis com crontab -l e comportam-se de forma idêntica às entradas adicionadas manualmente.

Matriz de Decisão: Qual Camada Cron Utilizar

Caso de UtilizaçãoCamada Recomendada
Automatização pessoal para um único utilizadorCrontab de utilizador (crontab -e)
Tarefas de manutenção do sistema (cópias de segurança, rotação de logs)/etc/cron.d/ ou /etc/crontab
Scripts que devem ser executados mesmo após um agendamento perdidoAnacron (/etc/anacrontab)
Tarefas com dependências complexas ou ordenação de serviçosTemporizadores systemd
Jobs ao nível da aplicação implementados com um pacote/etc/cron.d/<package-name>
Ambientes em contentoresSupervisor + cron, ou Kubernetes CronJob

Lista de Verificação de Pontos-Chave Práticos

  • Execute crontab -l para auditar os seus próprios jobs; utilize o padrão de ciclo for para auditar todos os utilizadores num servidor multiutilizador.
  • Verifique sempre /etc/crontab, /etc/cron.d/ e systemctl list-timers --allcrontab -l por si só fornece uma imagem incompleta.
  • Utilize caminhos absolutos para todos os comandos e binários dentro das entradas do crontab.
  • Defina MAILTO="" ou redirecione a saída explicitamente para evitar falhas silenciosas em servidores sem um MTA.
  • Faça uma cópia de segurança do seu crontab com crontab -l > backup.txt antes de qualquer sessão de edição.
  • Utilize flock para evitar a execução simultânea de jobs de longa duração.
  • Em sistemas systemd, verifique journalctl -u cron em vez de depender exclusivamente de /var/log/syslog.
  • Valide novas expressões de tempo com um testador de expressões cron online antes de implementar em produção.
  • Tenha em conta UTC vs. fuso horário local em instâncias de cloud e VPS Hosting.
  • Para servidores de Email Hosting ou qualquer infraestrutura onde os jobs são críticos, implemente monitorização externa (por exemplo, pings de verificação de saúde) para detetar falhas silenciosas do cron.

FAQ

Como listo todos os cron jobs de todos os utilizadores num servidor Linux?

Itere sobre /etc/passwd e chame sudo crontab -l -u <user> para cada conta, suprimindo erros “no crontab” com 2>/dev/null. Adicionalmente, inspecione /etc/crontab, /etc/cron.d/ e execute systemctl list-timers --all para capturar jobs ao nível do sistema e geridos pelo systemd.

Por que razão crontab -l não mostra nada mesmo que os jobs estejam a ser executados?

Os jobs estão provavelmente definidos em /etc/crontab, num ficheiro dentro de /etc/cron.d/, ou como temporizadores systemd — nenhum dos quais é visível via crontab -l. Esse comando mostra apenas o crontab pessoal do utilizador que o chama, armazenado no diretório de spool.

Qual é a diferença entre /etc/crontab e /etc/cron.d/?

Ambos utilizam a mesma sintaxe de seis campos (incluindo o campo de nome de utilizador) e são lidos pelo daemon cron do sistema. /etc/crontab é um único ficheiro monolítico destinado à administração manual do sistema. /etc/cron.d/ é um diretório drop-in onde pacotes ou serviços individuais instalam os seus próprios ficheiros de jobs, mantendo-os isolados e mais fáceis de gerir ou remover de forma independente.

Como evito que um cron job execute múltiplas instâncias sobrepostas?

Envolva o comando com flock -n /tmp/lockfile.lock para adquirir um bloqueio exclusivo não bloqueante. Se uma instância anterior ainda estiver em execução, a nova invocação sai imediatamente sem executar o comando, evitando contenção de recursos e corrupção de dados.

Onde são armazenados os logs dos cron jobs e como depuro um job que não está a ser executado?

Na maioria dos sistemas, o cron regista em /var/log/syslog (filtre com grep CRON) ou via journald (journalctl -u cron). Para depuração, adicione temporariamente >> /tmp/debug.log 2>&1 ao comando do job para capturar toda a saída, verifique se o script é executável, confirme que o daemon está em execução com systemctl status cron e valide a expressão de tempo de forma independente.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar