(Já li Como posso testar um novo script cron? .)
Eu tenho um problema específico (o cron job não parece ser executado ou executado corretamente), mas o problema é geral: gostaria de depurar scripts que são cronned. 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 cron job a partir da linha de comando como se o cron o 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 mudanças de script não é prático.
Aqui está o que eu fiz, e parece funcionar nesta situação. Pelo menos, ele me mostra um erro, enquanto a execução da linha de comando, pois o usuário não mostra o erro.
Passo 1 : Coloquei esta linha temporariamente no crontab do usuário:
em seguida, tirou-o uma vez que o arquivo foi escrito.
Etapa 2 : Criei um pequeno script bash executado como cron contendo:
Então, como usuário em questão, pude
Esta solução poderia obviamente ser expandida para fazer uso de sudo ou algo semelhante para maior flexibilidade.
Espero que isso ajude os outros.
Apresento uma solução baseada na resposta de Pistos, mas sem as 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 os cron jobs são executados:
Usar:
por exemplo
Observe que o segundo argumento precisa ser citado se exigir um argumento. A primeira linha do script carrega um shell POSIX como interpretador. A segunda linha origina o arquivo de 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 vazamento de variáveis de ambiente no novo shell), inicia o mesmo shell que é usado para cronjobs e carrega as variáveis de ambiente cron. Finalmente o comando é executado.Como o crontab não faz o trabalho, você vai manipular seu conteúdo:
O que faz :
Por padrão, com a maioria dos daemons cron padrão que eu já vi, simplesmente não há como dizer ao cron para ser executado aqui e agora. Se você estiver usando o anacron, talvez seja possível executar uma instância separada em primeiro plano.
Se seus scripts não estão rodando corretamente então você não está levando em conta que
De crontab(5):
Em geral, PATH é o maior problema, então você precisa:
Se você precisar executar o script como outro usuário sem shell (por exemplo, www-data), use sudo:
A primeira coisa a testar antes de tudo isso, é claro, é que seu script realmente faz o que deveria fazer a partir da linha de comando. Se você não puder executá-lo a partir da linha de comando, obviamente não funcionará com o cron.
O roteiro de Marco não funcionou para mim por algum motivo. Eu não tive tempo para depurar, então escrevi um script Python que faz a mesma coisa. É mais longo, mas: primeiro, funciona para mim e, segundo, acho mais fácil de entender. Altere "/tmp/cron-env" para onde você salvou seu ambiente. Aqui está:
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 $2ps O python do Noam funcionou porque 'exportou' o ambiente para o processo filho.
Eu pensei na resposta de Marco. O código é mostrado abaixo, mas vou manter este script aqui .
Dado este crontab:
Exemplo de sessão de uso:
Isto é
cronTest2
, que precisa ser invocado corretamente para configurar as variáveis de ambiente da mesma forma que o cron faz:cronTest
é executadocronTest2
com as variáveis de ambiente adequadas definidas:Na maioria dos crontabs como por exemplo vixie-cron você pode colocar variáveis no próprio crontab assim e então usar /usr/bin/env para verificar se funcionou. Dessa forma, você pode fazer seu script funcionar no crontab assim que descobrir o que está errado com o script run-as-cron.
Se for um script de shell, isso deve ajudá-lo na maior parte do caminho:
Definitivamente, destacará alguns problemas, se não tudo.
Bem, o usuário é o mesmo que você colocou na entrada do crontab (ou em cujo crontab você o colocou, alternadamente), então isso é óbvio.
crontab
(5) deve fornecer a lista de variáveis de ambiente definidas, existem apenas algumas.