Geralmente, os crontab
scripts não são executados dentro do cronograma ou conforme o esperado. Existem inúmeras razões para isso:
- notação incorreta do crontab
- problema de permissões
- variáveis ambientais
Este wiki da comunidade visa agregar os principais motivos para os crontab
scripts não serem executados conforme o esperado. Escreva cada motivo em uma resposta separada.
Inclua um motivo por resposta - detalhes sobre por que ele não foi executado - e as correções por esse motivo.
Por favor, escreva apenas problemas específicos do cron, por exemplo, comandos que são executados conforme o esperado do shell, mas executados erroneamente pelo cron.
crontab -e
para que o cron tenha efeito. Por exemplo, usando o vim, edito o arquivo e o uso:w
para escrevê-lo, mas o trabalho não é adicionado ao cron até que eu saia também. Então, eu não vou ver o trabalho até depois:q
também.Respostas:
Ambiente diferente
O Cron passa um conjunto mínimo de variáveis de ambiente para seus trabalhos. Para ver a diferença, adicione um trabalho fictício como este:
Aguarde
/tmp/env.output
a criação e remova o trabalho novamente. Agora compare o conteúdo de/tmp/env.output
com a saída deenv
execução em seu terminal regular.Uma "pegadinha" comum aqui é a
PATH
variável de ambiente ser diferente. Talvez o seu script cron usa o comandosomecommand
encontrado em/opt/someApp/bin
que você adicionou aPATH
em/etc/environment
? O cron ignoraPATH
esse arquivo; portanto, a execuçãosomecommand
do seu script falhará quando executada com o cron, mas funcionará quando executada em um terminal. Vale ressaltar que as variáveis from/etc/environment
serão passadas para os trabalhos cron, mas não as variáveis que o cron se define especificamente, comoPATH
.Para contornar isso, basta definir sua própria
PATH
variável na parte superior do script. Por exemploAlguns preferem usar apenas caminhos absolutos para todos os comandos. Eu recomendo contra isso. Considere o que acontece se você deseja executar seu script em um sistema diferente e, nesse sistema, o comando está dentro
/opt/someAppv2.2/bin
. Você teria que passar pelo script inteiro substituindo/opt/someApp/bin
por, em/opt/someAppv2.2/bin
vez de apenas fazer uma pequena edição na primeira linha do script.Você também pode definir a variável PATH no arquivo crontab, que será aplicado a todos os trabalhos cron. Por exemplo
fonte
env
, eu tinha esquecido completamente esse comando e pensei que PATH estava funcionando. Na verdade, era um pouco diferente no meu caso.Minha principal dica: se você esquecer de adicionar uma nova linha no final do
crontab
arquivo. Em outras palavras, o arquivo crontab deve terminar com uma linha vazia.Abaixo está a seção relevante nas páginas do manual para esse problema (
man crontab
pule para o final):fonte
man crontab
no Ubuntu 10.10 diz "cron requer que cada entrada em um crontab termine com um caractere de nova linha. Se a última entrada em um crontab estiver ausente da nova linha, o cron considerará o crontab (pelo menos parcialmente) quebrado e se recusar a instalá-lo. " (E a data no final é de 19 de Abril de 2010.)crontab -e
ele verificará a sintaxe do arquivo antes de permitir um salvamento, incluindo uma verificação de nova linha.-e
opção e é independente do editor.O daemon Cron não está sendo executado. Eu realmente estraguei tudo isso há alguns meses atrás.
Tipo:
Se você não vir um número, o cron não está sendo executado.
sudo /etc/init.d/cron start
pode ser usado para iniciar o cron.EDIT: Em vez de chamar scripts init através do /etc/init.d, use o utilitário de serviço, por exemplo
EDIT: Você também pode usar o systemctl no Linux moderno, por exemplo
fonte
pidof cron
que omitirá resultados para outros aplicativos que também tenham a palavra 'cron', como crontab.sudo service cron start
eu recebostart: Job is already running: cron
service crond start
if its centos / RHELO script nomes de arquivos em
cron.d/
,cron.daily/
,cron.hourly/
, etc., não devem conter pontos (.
), caso contrário run-parts irá ignorá-los.Veja peças de execução (8):
Portanto, se você tiver um script cron
backup.sh
,analyze-logs.pl
nocron.daily/
diretório, é melhor remover os nomes das extensões.fonte
run-parts --test
(ou outra opção imaginário como--debug
saída seria os arquivos que ele ignora incluindo a razão.Em muitos ambientes, o cron executa comandos usando
sh
, enquanto muitas pessoas assumem que o usarábash
.Sugestões para testar ou corrigir isso para um comando com falha:
Tente executar o comando
sh
para ver se funciona:Embrulhe o comando em um subshell bash para garantir que ele seja executado no bash:
Diga ao cron para executar todos os comandos no bash, configurando o shell na parte superior do seu crontab:
Se o comando for um script, verifique se o script contém um shebang:
fonte
bash
, mas não o écron
. Obrigado!source
está no bash, mas não no sh. No cron / sh, use um ponto: em. envfile
vez desource envfile
.sh "mycommand"
dizsh
para executar o mycommand como um arquivo de script. Você quis dizersh -c "mycommand"
? De qualquer forma, essa resposta parece ser sobre como executar o comando especificamente no bash, então por que você adicionou o comandosh
aqui?Eu tive alguns problemas com os fusos horários. Cron estava funcionando com o novo fuso horário da instalação. A solução foi reiniciar o cron:
fonte
* * * * * touch /tmp/cronworks
não fez nada, ainda existeRELOAD
no cronlog.O caminho absoluto deve ser usado para scripts:
Por exemplo,
/bin/grep
deve ser usado em vez degrep
:Ao invés de:
Isso é especialmente complicado, porque o mesmo comando funcionará quando executado a partir do shell. O motivo é que
cron
não possui a mesmaPATH
variável de ambiente que o usuário.fonte
/usr/bin/whatever
caminhoSe o seu comando crontab possui um
%
símbolo, o cron tenta interpretá-lo. Portanto, se você estava usando algum comando com um%
(como uma especificação de formato para o comando date), será necessário escapá-lo.Essa e outras dicas boas aqui:
http://www.pantz.org/software/cron/croninfo.html
fonte
date
dentro de um trabalho da guia cron?Cron está chamando um script que não é executável.
Ao executar,
chmod +x /path/to/scrip
o script se torna executável e deve resolver esse problema.fonte
cron
e é facilmente rastreável, simplesmente tentando executar a/path/to/script
partir da linha de comando.. scriptname
oush scriptname
oubash scriptname
, isso se torna umcron
problema específico.Também é possível que a senha do usuário tenha expirado. Até a senha do root pode expirar. Você pode
tail -f /var/log/cron.log
e verá o cron falhar com a senha expirada. Você pode definir a senha para nunca expirar fazendo o seguinte:passwd -x -1 <username>
Em alguns sistemas (Debian, Ubuntu), o registro do cron não é ativado por padrão. Em /etc/rsyslog.conf ou /etc/rsyslog.d/50-default.conf, a linha:
deve ser editado (
sudo nano /etc/rsyslog.conf
) descomentado para:Depois disso, você precisa reiniciar o rsyslog via
ou
Fonte: Habilite o log do crontab no Debian Linux
Em alguns sistemas (Ubuntu), o arquivo de log separado para o cron não é ativado por padrão, mas os logs relacionados ao cron estão aparecendo no arquivo syslog. Pode-se usar
para visualizar mensagens relacionadas ao cron.
fonte
Se o seu cronjob chama aplicativos GUI, você precisa dizer a eles que DISPLAY eles devem usar.
Exemplo: lançamento do Firefox com cron.
Seu script deve conter em
export DISPLAY=:0
algum lugar.fonte
* * * * * export DISPLAY=:0 && <command>
Problemas com permissões são bastante comuns, receio.
Observe que uma solução comum é executar tudo usando o crontab do root, que às vezes é uma péssima idéia. Definir permissões adequadas é definitivamente um problema amplamente esquecido.
fonte
Permissão insegura da tabela cron
Uma tabela cron será rejeitada se sua permissão for insegura
O problema é resolvido com
fonte
O script é sensível à localização. Isso está relacionado ao uso sempre de caminhos absolutos em um script, mas não é o mesmo. Seu trabalho cron pode precisar de
cd
um diretório específico antes da execução, por exemplo, uma tarefa de rake em um aplicativo Rails pode estar na raiz do aplicativo para que o Rake encontre a tarefa correta, sem mencionar a configuração apropriada do banco de dados, etc.Portanto, uma entrada crontab de
23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=production
seria melhor como
Ou, para manter a entrada do crontab mais simples e menos quebradiça:
23 3 * * * /home/<user>/scripts/session-purge.sh
com o seguinte código em
/home/<user>/scripts/session-purge.sh
:fonte
chdir(dirname(__FILE__));
As especificações do Crontab que funcionavam no passado podem ser quebradas quando movidas de um arquivo crontab para outro. Às vezes, o motivo é que você moveu as especificações de um arquivo crontab do sistema para um arquivo crontab do usuário ou vice-versa.
O formato da especificação da tarefa cron varia entre os arquivos crontab dos usuários (/ var / spool / cron / nome de usuário ou / var / spool / cron / crontabs / nome de usuário) e os crontabs do sistema (
/etc/crontab
e os arquivos inseridos/etc/cron.d
).Os crontabs do sistema têm um campo extra 'usuário' logo antes do comando para executar.
Isso causará erros informando coisas como
george; command not found
quando você move um comando/etc/crontab
ou um arquivo/etc/cron.d
para o arquivo crontab do usuário.Por outro lado, o cron fornecerá erros como
/usr/bin/restartxyz is not a valid username
ou similares quando ocorrer o inverso.fonte
O script cron está chamando um comando com a opção --verbose
Eu tive um script cron falhado em mim porque estava no piloto automático enquanto digitava o script e incluí a opção --verbose:
O script funcionou bem ao executar a partir do shell, mas falhou ao executar no crontab porque a saída detalhada vai para stdout quando executada no shell, mas em nenhum lugar quando executada no crontab. Correção fácil para remover o 'v':
fonte
A razão mais frequente pela qual vi o cron falhar em um cronograma declarado incorretamente. É necessário especificar um trabalho agendado para 23:15, em
15 23 * * *
vez de* * 11 15 *
ou11 15 * * *
. O dia da semana para trabalhos após a meia-noite também fica confuso. MF é2-6
depois da meia-noite, não1-5
. As datas específicas geralmente são um problema, pois raramente as usamos* * 3 1 *
em 3 de março. Se você não tiver certeza, verifique suas agendas cron online em https://crontab.guru/ .Se o seu trabalho com plataformas diferentes, usando opções não suportadas, como
2/3
especificações em tempo, também pode causar falhas. Esta é uma opção muito útil, mas não universalmente disponível. Também encontrei problemas com listas como1-5
ou1,3,5
.O uso de caminhos não qualificados também causou problemas. O caminho padrão é geralmente,
/bin:/usr/bin
portanto, apenas os comandos padrão serão executados. Esses diretórios geralmente não têm o comando desejado. Isso também afeta scripts usando comandos não padrão. Outras variáveis de ambiente também podem estar ausentes.Derrubar completamente um crontab existente me causou problemas. Agora carrego de uma cópia do arquivo. Isso pode ser recuperado do crontab existente usando
crontab -l
se ele for derrotado. Eu mantenho a cópia do crontab em ~ / bin. É comentado por toda parte e termina com a linha# EOF
. Isso é recarregado diariamente a partir de uma entrada do crontab como:O comando reload acima depende de um crontab executável com um caminho estridente executando o crontab. Alguns sistemas requerem o crontab em execução no comando e especificando o arquivo. Se o diretório for compartilhado em rede, geralmente uso
crontab.$(hostname)
como o nome do arquivo. Isso acabará corrigindo os casos em que o crontab errado está carregado no servidor errado.O uso do arquivo fornece um backup do que o crontab deve ser e permite que as edições temporárias (a única vez que eu uso
crontab -e
) sejam restauradas automaticamente. Existem cabeçalhos disponíveis que ajudam a acertar os parâmetros de agendamento. Eu os adicionei quando usuários inexperientes editariam um crontab.Raramente, encontrei comandos que exigem entrada do usuário. Eles falham no crontab, embora alguns funcionem com o redirecionamento de entrada.
fonte
30 23 * * *
traduzido para 23:15?15 23 * * *
. Corrigido agora.Se você estiver acessando uma conta através de chaves SSH, é possível fazer login na conta, mas não perceber que a senha da conta está bloqueada (por exemplo, devido a tentativas de senha expiradas ou inválidas)
Se o sistema estiver usando o PAM e a conta estiver bloqueada, isso poderá interromper a execução do cronjob. (Eu testei isso no Solaris, mas não no Ubuntu)
Você pode encontrar mensagens como esta em / var / adm / messages:
Tudo o que você precisa fazer é executar:
como root para desbloquear a conta e o crontab deve funcionar novamente.
fonte
Se você possui um comando como este:
e ele não funciona e você não pode ver nenhuma saída, pode não necessariamente significar que o cron não está funcionando. O script pode estar quebrado e a saída vai para o stderr, que não é passada para / tmp / output. Verifique se não é esse o caso, capturando esta saída também:
para ver se isso ajuda a detectar seu problema.
fonte
=== Alerta do Docker ===
Se você estiver usando o docker,
Eu acho que é apropriado acrescentar que não consegui fazer o cron rodar em segundo plano.
Para executar um trabalho cron dentro do contêiner, usei supervisor e executei
cron -f
, juntamente com o outro processo.Edit: Outro problema - eu também não consegui fazê-lo funcionar ao executar o contêiner com a rede HOST. Veja também este problema aqui: https://github.com/phusion/baseimage-docker/issues/144
fonte
Eu estava escrevendo um script de shell de instalação que cria outro script para limpar dados de transação antigos de um banco de dados. Como parte da tarefa, ele precisava configurar o
cron
trabalho diário para ser executado em um momento arbitrário, quando a carga do banco de dados era baixa.Criei um arquivo
mycronjob
com cron sched, nome de usuário e comando e copiei para o/etc/cron.d
diretório Minhas duas dicas:mycronjob
o arquivo tinha que pertencer ao root para ser executadoUm problema de permissão aparecerá
/var/log/syslog
como algo semelhante a:A primeira linha refere-se ao
/etc/crontab
arquivo e a posterior a um arquivo que eu coloquei abaixo/etc/cront.d
.fonte
Linha escrita de uma maneira que o crontab não entende. Ele precisa ser escrito corretamente. Aqui está o CrontabHowTo .
fonte
O daemon Cron pode estar em execução, mas na verdade não está funcionando. Tente reiniciar o cron:
fonte
pidof
cron e não tenho nada. Tentei usar oservice
utilitário e disse que o cron já estava em execução. Apenas executei este comando e executeipidof
novamente e recebo um resultado.Escrevendo no cron via "crontab -e" com o argumento de nome de usuário em uma linha. Já vi exemplos de usuários (ou administradores de sistemas) escrevendo seus scripts de shell e sem entender por que eles não automatizam. O argumento "user" existe em / etc / crontab, mas não nos arquivos definidos pelo usuário. então, por exemplo, seu arquivo pessoal seria algo como:
considerando que / etc / crontab seria:
Então, por que você faria o último? Bem, dependendo de como você deseja definir suas permissões, isso pode se tornar muito complicado. Escrevi scripts para automatizar tarefas para usuários que não entendem os meandros ou que não querem se preocupar com a labuta. Ao definir permissões para
--x------
, posso tornar o script executável sem que eles possam lê-lo (e talvez alterá-lo acidentalmente). No entanto, talvez eu queira executar esse comando com vários outros de um arquivo (facilitando a manutenção), mas certifique-se de que a saída do arquivo seja atribuída ao proprietário certo. Fazer isso (pelo menos no Ubuntu 10.10) quebra tanto a incapacidade de ler o arquivo quanto a sua execução, além do problema mencionado anteriormente com a colocação de períodos no / etc / crontab (que, curiosamente, não causa erros durante a execuçãocrontab -e
) .Como exemplo, eu vi instâncias
sudo crontab -e
usadas para executar um script com permissões de root, com uma correspondentechown username file_output
no shell script. Desleixado, mas funciona. IMHO, a opção mais elegante é colocá-lo/etc/crontab
com o nome de usuário declarado e as permissões apropriadas,file_output
para o local e o proprietário certos.fonte
Construindo o que Aaron Peart mencionou sobre o modo detalhado, às vezes os scripts que não estão no modo detalhado serão inicializados, mas não serão finalizados, se o comportamento padrão de um comando incluído for gerar uma linha ou mais na tela assim que o proc for iniciado. Por exemplo, escrevi um script de backup para nossa intranet que usava curl, um utilitário que baixa ou carrega arquivos em servidores remotos, e é bastante útil se você puder acessar apenas os arquivos remotos por HTTP. O uso de 'curl http://something.com/somefile.xls ' estava causando a interrupção de um script que eu escrevi e nunca foi concluído porque gera uma nova linha seguida por uma linha de progresso. Eu tive que usar o sinalizador silencioso (-s) para dizer para não gerar nenhuma informação e escrever em meu próprio código para lidar com o erro no download do arquivo.
fonte
/dev/null
. Por exemplo:some-command > /dev/null
Isso redirecionará apenas a saída padrão, e não a saída de erro (que geralmente é o que você deseja, pois deseja ser informado sobre erros). Para redirecionar também a saída de erro, usesome-command &> /dev/null
.Embora você possa definir variáveis de ambiente em seu crontable, você não está em um script de shell. Portanto, construções como as seguintes não funcionarão:
Isso ocorre porque as variáveis não são interpretadas no crontable: todos os valores são tomados literalmente. E é o mesmo se você omitir os colchetes. Portanto, seus comandos não serão executados e seus arquivos de log não serão gravados ...
Em vez disso, você deve definir todas as suas variáveis de ambiente diretamente:
fonte
Quando uma tarefa é executada no cron, o stdin é fechado. Os programas que agem de maneira diferente, com base na disponibilidade ou não do stdin, terão um comportamento diferente entre a sessão do shell e o cron.
Um exemplo é o programa
goaccess
para analisar arquivos de log do servidor da web. Isso NÃO funciona no cron:e
goaccess
mostra a página de ajuda em vez de criar o relatório. Na concha, isso pode ser reproduzido comA correção para isso
goaccess
é fazê-lo ler o log do stdin em vez de ler o arquivo, portanto, a solução é alterar a entrada do crontab parafonte
No meu caso, cron e crontab tinham proprietários diferentes.
NÃO funcionando eu tinha o seguinte:
Basicamente, eu tive que executar o cron-config e responder às perguntas corretamente. Há um ponto em que fui solicitado a inserir minha senha de usuário Win7 para minha conta 'Usuário'. Pela leitura que fiz, parece que esse é um problema de segurança em potencial, mas sou o único administrador em uma única rede doméstica e, por isso, decidi que estava tudo bem.
Aqui está a sequência de comandos que me motivou:
fonte
Nos meus servidores RHEL7, os trabalhos raiz do cron eram executados, mas os trabalhos do usuário não. Descobri que sem um diretório inicial, os trabalhos não serão executados (mas você verá bons erros em / var / log / cron). Quando eu criei o diretório inicial, o problema foi resolvido.
fonte
Se você editou seu arquivo crontab usando um editor do Windows (via samba ou algo assim) e substituiu as novas linhas por \ n \ r ou apenas \ r, o cron não será executado.
Além disso, se você estiver usando o /etc/cron.d/* e um desses arquivos tiver um \ r, o cron passará pelos arquivos e parará quando encontrar um arquivo incorreto. Não tem certeza se esse é o problema?
Usar:
fonte