Questão:
Shell padrão para problema de cron
cupakob
2012-10-10 13:02:53 UTC
view on stackexchange narkive permalink

Tenho alguns comandos que funcionam no bash, mas não como cronjob. Para ver a causa do problema, estou salvando a saída em um arquivo, aqui meu exemplo:

  51 * * * * source ~ / .rvm / scripts / rvm >> stack.log 2>&1  

O conteúdo do arquivo de log é:

  / bin / sh: 1: source: not found  

Isso significa que o cron está usando sh ao invés de bash . Eu tentei mudá-lo no /etc/crontab:

SHELL=/bin/bash

Mas isso não funciona. Eu olhei em / etc / passwd e aqui eu vejo que o daemon está usando sh como shell padrão. Ambos root e pi têm bash como shell padrão.

  root: x: 0: 0: root : / root: / bin / bashdaemon: x: 1: 1: daemon: / usr / sbin: / bin / shpi: x: 1000: 1000: ,,,: / home / pi: / bin / bash  

O que devo fazer para alterar o shell padrão do cron? Eu não definiria / bin / bash para o usuário daemon em / etc / passwd ... imho, isso não é uma boa ideia.

edit Budap:

  ls -l / bin / shlrwxrwxrwx 1 root 4 30 de março de 2012 / bin / sh -> traço  

aqui o conteúdo do /etc/crontab:

  # / etc / crontab: crontab de todo o sistema # Ao contrário de qualquer outro crontab, você não precisa executar o comando `crontab '# para instalar a nova versão ao editar este arquivo # e arquivos em /etc/cron.d. Esses arquivos também têm campos de nome de usuário, # que nenhum dos outros crontabs faz.SHELL = / bin / bashPATH = / usr / local / sbin: / usr / local / bin: / sbin: / bin: / usr / sbin: / usr / bin # mh dom mon dow user command17 * * * * root cd / && run-parts --report /etc/cron.hourly25 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) #  
Por que você quer `fonte` no ambiente crons? Simplesmente rodar `~ / .rvm / scripts / rvm` não funciona? E você _pode_ ter problemas ao usar ~ em ambientes não-bash.
Quatro respostas:
Krzysztof Adamski
2012-10-10 13:07:33 UTC
view on stackexchange narkive permalink

A maioria desses casos (onde o script funciona no shell, mas não no cron) ocorre devido a variáveis ​​de ambiente que são diferentes no script. Em muitos casos, o problema é a variável PATH . Você pode usar caminhos completos para todos os executáveis ​​que está executando no script ou modificar PATH na primeira linha do seu script.

Para rastrear esses problemas, você pode começar despejando variáveis ​​de ambiente disponíveis ao seu script usando o comando env , como este: / usr / bin / env> /tmp/env.txt

não tenho nenhuma variável de ambiente em meu script ... e / bin / env não existe.
Não, você _sempre_ tem algumas variáveis ​​de ambiente em cada shell. Um exemplo é `PATH` que já foi mencionado. Tente `/ usr / bin / env` ao invés. Ou use `which env` para verificar qual é o seu caminho completo para o utilitário` env`.
Alex Chamberlain
2012-10-10 13:12:14 UTC
view on stackexchange narkive permalink

O shell usado é traço ; um shell compatível com POSIX, que é projetado para ser muito menor e mais estável do que bash.

Alguém poderia argumentar que você deveria escrever tarefas cron para ser compatível com POSIX. Como alternativa, tente encapsular sua lógica em um script e prefixar o shebang

  #! / Usr / bin / env bash  
por que #! / usr / bin / env bash e não #! / bin / bash? Qual é a diferença?
IMHO não muito. Estritamente falando, permite que `bash` seja armazenado em outro lugar. Quem faria isso, eu não sei!
eu tentei isso também ... eu tenho um script bash wrapper, que chama meu comando, mas isso também não funciona. Mas estou vagando, por que as mudanças no / etc / crontab não fazem a mudança para o bash.
@cupakob Você pode colar o `/ etc / crontab` inteiro, por favor?
você pode encontrar no meu post
Eu acho que o problema é que `source` é um builtin, que não faz sentido rodar por conta própria.
deixe-nos [continuar esta discussão no chat] (http://chat.stackexchange.com/rooms/6073/discussion-between-cupakob-and-alex-chamberlain)
Avio
2012-10-10 15:48:16 UTC
view on stackexchange narkive permalink

Tem certeza de que sourcing seu script em cron é absolutamente o que você deseja fazer e, mais importante, necessário? Acho que quase sempre é uma má ideia.

Além disso, quando você estiver editando cron (bem como outras ferramentas que podem ser possivelmente iniciadas por outros usuários e / ou outros shells), tente dar um passo abordagem de passo. Por exemplo, você pode testar seu ambiente com algo assim:

  42 * * * * bash -c "echo home --- $ HOME ---" >> / tmp / cron-temp .log 2>&142 * * * * bash -c "echo shell --- $ SHELL ---" >> /tmp/cron-temp.log 2>&1  ou mesmo 

  42 * * * * bash -c "export" >> /tmp/cron-temp.log 2>&1  

Assim, você pode ter uma prova de seu ambiente, etc.

Para responder à sua pergunta, eu não mudaria o shell do cron . Eu simplesmente diria a ele para chamar bash e então deixar bash chamar seus scripts.

o $ SHELL ainda estava 'sh' apesar de eu tê-lo alterado no / etc / crontab
Sim, também é o padrão no meu `cron`. Como eu disse, não mudaria. Apenas chame seu script por meio de `bash` com` bash -c "yourscript" `e tudo deverá ficar bem (não forneça seu script, provavelmente você não precisa dele!)
sim, isso vai funcionar, mas eu quero saber, por que o shell padrão não foi alterado.
cupakob
2012-10-11 02:27:09 UTC
view on stackexchange narkive permalink

Então .... eu tenho duas soluções para o meu problema:

  1. Script wrapper sobre o comando bash, que estou chamando no momento como cronjob. O problema aqui - para cada cronjob eu preciso de um invólucro, e esta não é a melhor solução para mim.

  2. Eu tentei chamar um script ruby ​​como cronjob. Isso não funciona, então eu pensei, eu preciso chamar 'rvm use 1.9.3' e para isso eu preciso primeiro chamar 'source ~ / .rvm / scripts / rvm'. E aqui estava meu erro. Na minha instância do bash, tenho o caminho para o ruby, mas não como o cron. Depois de consertar isso, tudo está funcionando bem e posso executar meus scripts de ruby ​​como cronjob.

Alex Chamberlain me ajudou muito e me deu as dicas mais importantes . Muito obrigado pela ajuda !!!



Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...