(Eu já li Como posso testar um novo script cron?. )
Eu tenho um problema específico (o trabalho do cron não parece ser executado ou é executado corretamente), mas o problema é geral: eu gostaria de depurar scripts que são programados. Estou ciente de que posso configurar uma linha * * * * * crontab, mas essa não é uma solução totalmente satisfatória. Eu gostaria de poder executar um trabalho cron a partir da linha de comando, como se o cron estivesse executando (mesmo usuário, mesmas variáveis de ambiente etc.). Existe uma maneira de fazer isso? Ter que esperar 60 segundos para testar as alterações de script não é prático.
Respostas:
Aqui está o que eu fiz, e parece funcionar nessa situação. Pelo menos, ele me mostra um erro, enquanto a execução na linha de comando, pois o usuário não mostra o erro.
Etapa 1 : coloquei essa linha temporariamente no crontab do usuário:
depois retirou-o assim que o arquivo foi gravado.
Etapa 2 : Criei um pequeno script bash run-as-cron contendo:
Então, como usuário em questão, eu pude
Obviamente, essa solução poderia ser expandida para usar o sudo ou algo semelhante para obter mais flexibilidade.
Espero que isso ajude os outros.
fonte
/usr/bin
. 2) Acat …/cron-env
saída de várias linhas, ou seja, não funciona. Apenas tente executar/usr/bin/env -i $(cat cron-env) echo $PATH
no terminal, ele gera o ambiente literalmente em vez de usá-lo. 3) O ambiente atual vaza no ambiente cron emulado. Tente:export foo=leaked; run-as-cron echo $foo
.cat
gera várias linhas, que funcionam, porque a substituição do shell as reduz em uma única linha, com a qual você pode verificarecho $(cat cron-env ) | wc
; seu comando de exemplo/usr/bin/env -i $(cat cron-env) echo $PATH
substitui$PATH
o shell de chamada; em vez disso, deve invocar um subshell para substituir no subambiente, por exemplo/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Você fez o mesmo erro, novamente substituindo no shell chamado em vez de no subambienteApresento uma solução baseada na resposta de Pistos, mas sem falhas.
Adicione a seguinte linha ao crontab, por exemplo, usando
crontab -e
Crie um script de shell que execute um comando no mesmo ambiente em que as tarefas cron são executadas:
Usar:
por exemplo
Observe que o segundo argumento precisa ser citado se precisar de um argumento. A primeira linha do script carrega um shell POSIX como intérprete. A segunda linha origina o arquivo do ambiente cron. Isso é necessário para carregar o shell correto, que é armazenado na variável de ambiente
SHELL
. Em seguida, ele carrega um ambiente vazio (para evitar o vazamento de variáveis de ambiente no novo shell), inicia o mesmo shell usado para cronjobs e carrega as variáveis de ambiente cron. Finalmente, o comando é executado.fonte
Como o crontab não faz o trabalho, você manipula seu conteúdo:
O que faz :
fonte
sudo -H -u otheruser bash -c 'crontab..."
executar o crontab de outro usuário btwPor padrão, com a maioria dos daemons padrão do cron que eu já vi, simplesmente não há como dizer ao cron para rodar aqui agora. Se você estiver usando o anacron, acho que é possível executar uma instância separada em primeiro plano.
Se seus scripts não estiverem sendo executados corretamente, você não levará em consideração que
Do crontab (5):
Em geral, PATH é o maior problema, então você precisa:
Se você precisar executar o script como outro usuário sem um shell (por exemplo, www-data), use sudo:
A primeira coisa a testar antes de tudo isso, é claro, é que seu script realmente faz o que deve fazer na linha de comando. Se você não pode executá-lo na linha de comando, obviamente não funcionará com o cron.
fonte
O roteiro de Marco não funcionou para mim por algum motivo. Como não tive tempo de depurar, escrevi um script Python que faz a mesma coisa. É mais longo, mas: primeiro, funciona para mim e, segundo, acho mais fácil entender. Altere "/ tmp / cron-env" para onde você salvou seu ambiente. Aqui está:
fonte
Bem, o usuário é o mesmo que você inseriu na entrada do crontab (ou em qual crontab você o inseriu, alternadamente), então isso é óbvio.
crontab
(5) deve fornecer a lista de variáveis de ambiente definidas, existem apenas algumas.fonte
Na maioria dos crontabs como, por exemplo, vixie-cron, você pode colocar variáveis no próprio crontab assim e usar / usr / bin / env para verificar se funcionou. Dessa forma, você pode fazer seu script funcionar no crontab depois de descobrir o que há de errado com o script run-as-cron.
fonte
A solução de Marco não funcionou para mim, mas o script python de Noam funcionou. Aqui está uma pequena modificação no script de Marco que o fez funcionar para mim:
As
set -a
variáveis de exportação adicionadas definidas no script $ 1 e disponibilizadas para o comando $ 2O python do ps Noam funcionou porque ele 'exportou' o ambiente para o processo filho.
fonte
Se é um script de shell, isso deve levá-lo ao longo do caminho:
Definitivamente, destacará alguns problemas, se não tudo.
fonte
Eu nunca encontrei uma maneira de executar tarefas cron manualmente, mas esse artigo sugere definir o mesmo ambiente que o cronjob teria e executar o script manualmente.
fonte
você pode programar o trabalho para começar no próximo minuto :)
fonte
Eu mexi na resposta de Marco. O código é mostrado abaixo, mas vou manter esse script aqui .
Dado este crontab:
Sessão de uso de amostra:
Isto é
cronTest2
, que precisa ser chamado corretamente para configurar as variáveis de ambiente da mesma maneira que o cron:cronTest
é executadocronTest2
com o conjunto de variáveis de ambiente apropriado:fonte