Como corrigir todos os problemas / problemas relacionados ao crontab (Linux)
Este é um wiki da comunidade . Se você notar algo incorreto com esta resposta ou tiver informações adicionais, edite-o.
Primeiro, terminologia básica:
- cron (8) é o daemon que executa comandos agendados.
- O crontab (1) é o programa usado para modificar os arquivos do usuário crontab (5).
- O crontab (5) é um arquivo por usuário que contém instruções para o cron (8).
Em seguida, educação sobre o cron:
Todo usuário em um sistema pode ter seu próprio arquivo crontab. A localização dos arquivos raiz e de usuário do crontab depende do sistema, mas geralmente está abaixo /var/spool/cron
.
Há um /etc/crontab
arquivo em todo o sistema, o /etc/cron.d
diretório pode conter fragmentos de crontab que também são lidos e acionados pelo cron. Algumas distribuições Linux (por exemplo, Red Hat) também possuem /etc/cron.{hourly,daily,weekly,monthly}
diretórios, scripts dentro dos quais serão executados a cada hora / dia / semana / mês, com privilégios de root.
o root sempre pode usar o comando crontab; usuários regulares podem ou não receber acesso. Quando você edita o arquivo crontab com o comando crontab -e
e o salva, o crond verifica a validade básica, mas não garante que o arquivo crontab esteja formado corretamente. Existe um arquivo chamado cron.deny
que especificará quais usuários não podem usar o cron. O cron.deny
local do arquivo depende do sistema e pode ser excluído, o que permitirá que todos os usuários usem o cron.
Se o computador não estiver ligado ou o daemon crond não estiver em execução, e a data / hora para a execução de um comando tiver passado, o crond não recuperará e executará consultas anteriores.
detalhes do crontab, como formular um comando:
Um comando crontab é representado por uma única linha. Você não pode usar \
para estender um comando em várias linhas. O #
sinal hash ( ) representa um comentário, o que significa que qualquer coisa nessa linha é ignorada pelo cron. Os espaços em branco à esquerda e as linhas em branco são ignorados.
Tenha MUITO cuidado ao usar o %
sinal de porcentagem ( ) no seu comando. A menos que sejam escapados, \%
eles são convertidos em novas linhas e tudo após o primeiro não escapado %
é passado ao seu comando no stdin.
Existem dois formatos para arquivos crontab:
Usuário crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
Sistema amplo /etc/crontab
e /etc/cron.d
fragmentos
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Observe que o último requer um nome de usuário. O comando será executado como o usuário nomeado.
Os 5 primeiros campos da linha representam o (s) horário (s) em que o comando deve ser executado. Você pode usar números ou nomes aplicáveis de dia / mês, na especificação de horário.
- Os campos são separados por espaços ou tabulações.
- Uma vírgula (
,
) é usada para especificar uma lista, por exemplo, 1,4,6,8, o que significa executar em 1,4,6,8.
- As faixas são especificadas com um traço (
-
) e podem ser combinadas com listas, por exemplo, 1-3,9-12, o que significa entre 1 e 3 e depois entre 9 e 12.
- O
/
caractere pode ser usado para introduzir uma etapa, por exemplo, 2/5, o que significa começar de 2 a cada 5 (2,7,12,17,22 ...). Eles não passam pelo final.
- Um asterisco (
*
) em um campo significa o intervalo inteiro para esse campo (por exemplo, 0-59
para o campo minuto).
- É possível combinar faixas e etapas, por exemplo,
*/2
significa começar no mínimo para o campo relevante e, a cada 2, por exemplo, 0 por minutos (0,2 ... 58), 1 por meses (1,3 ... 11) etc.
Depurando Comandos Cron
Verifique o email!
Por padrão, o cron enviará qualquer saída do comando para o usuário que estiver executando o comando como. Se não houver saída, não haverá correio. Se você quiser que o cron envie e-mails para uma conta diferente, poderá definir a variável de ambiente MAILTO no arquivo crontab, por exemplo
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Capte a saída você mesmo
Você pode redirecionar stdout e stderr para um arquivo. A sintaxe exata para capturar a saída pode variar dependendo do cron que o shell está usando. Aqui estão dois exemplos que salvam toda a saída em um arquivo em /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Olhe para os logs
O Cron registra suas ações via syslog, que (dependendo da configuração) costuma ir para /var/log/cron
ou /var/log/syslog
.
Se necessário, você pode filtrar as instruções cron com, por exemplo,
grep CRON /var/log/syslog
Agora que examinamos o básico do cron, onde estão os arquivos e como usá-los, vamos ver alguns problemas comuns.
Verifique se o cron está em execução
Se o cron não estiver em execução, seus comandos não serão agendados ...
ps -ef | grep cron | grep -v grep
você deve obter algo como
root 1224 1 0 Nov16 ? 00:00:03 cron
ou
root 2018 1 0 Nov14 ? 00:00:06 crond
Se não o reiniciar
/sbin/service cron start
ou
/sbin/service crond start
Pode haver outros métodos; use o que sua distribuição fornece.
O cron executa seu comando em um ambiente restrito.
Quais variáveis de ambiente estão disponíveis provavelmente são muito limitadas. Normalmente, você só vai conseguir algumas variáveis definidas, como $LOGNAME
, $HOME
, e $PATH
.
De nota particular é o PATH
é restrito a /bin:/usr/bin
. A grande maioria dos problemas "meu script cron não funciona" é causada por esse caminho restritivo . Se o seu comando estiver em um local diferente, você poderá resolver isso de duas maneiras:
Forneça o caminho completo para o seu comando.
1 2 * * * /path/to/your/command
Forneça um PATH adequado no arquivo crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
Se o seu comando exigir outras variáveis de ambiente, você também poderá defini-las no arquivo crontab.
O cron executa seu comando com cwd == $ HOME
Independentemente de onde o programa que você executa reside no sistema de arquivos, o diretório de trabalho atual do programa quando o cron é executado será o diretório inicial do usuário . Se você acessar arquivos no seu programa, precisará levar isso em consideração se usar caminhos relativos, ou (preferencialmente) apenas caminhos totalmente qualificados em todos os lugares e poupar a todos muita confusão.
O último comando no meu crontab não roda
Cron geralmente requer que os comandos sejam finalizados com uma nova linha. Edite seu crontab; vá para o final da linha que contém o último comando e insira uma nova linha (pressione enter).
Verifique o formato crontab
Você não pode usar um usuário crontab formatado em crontab para / etc / crontab ou os fragmentos em /etc/cron.d e vice-versa. Um crontab formatado pelo usuário não inclui um nome de usuário na 6ª posição de uma linha, enquanto um crontab formatado pelo sistema inclui o nome do usuário e executa o comando como esse usuário.
Coloquei um arquivo em /etc/cron.{hourly,daily,weekly,monthly} e ele não é executado
- Verifique se o nome do arquivo não possui uma extensão, consulte run-parts
- Verifique se o arquivo possui permissões de execução.
- Diga ao sistema o que usar ao executar seu script (por exemplo, colocar
#!/bin/sh
no topo)
Erros relacionados à data do Cron
Se sua data foi alterada recentemente por uma atualização de usuário ou de sistema, fuso horário ou outro, o crontab começará a se comportar de maneira irregular e exibirá erros bizarros, às vezes funcionando, às vezes não. Esta é a tentativa do crontab de tentar "fazer o que quiser" quando o tempo mudar de baixo dele. O campo "minuto" ficará ineficaz após a hora ser alterada. Nesse cenário, apenas asteriscos seriam aceitos. Reinicie o cron e tente novamente sem conectar-se à Internet (para que a data não tenha a chance de redefinir para um dos servidores de horário).
Sinais de porcentagem, novamente
Para enfatizar os conselhos sobre sinais de porcentagem, aqui está um exemplo do que o cron faz com eles:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
criará o arquivo ~ / cron.out contendo as 3 linhas
foo
bar
baz
Isso é particularmente intrusivo ao usar o date
comando Certifique-se de escapar dos sinais de porcentagem
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"