cron e "command não encontrado"

Estou configurando um trabalho cron paira executair um script bash executável que contém um command pypdfocr. Sempre que eu executo manualmente o script, tudo funciona como esperado, se, em vez disso, eu use o cron com esta programação:

* 6 * * * cd /path/to/ && ./executable 

Recebo este erro:

 pypdfocr: command not found 

Dado isso, no script bash eu tentei dair o path completo paira pypdfocr, ou seja:

 /anaconda/bin/pypdfocr 

Mas agora eu tenho:

 /bin/sh: pdfimages: command not found /bin/sh: gs: command not found 

Alguma idéia de como eu conserto isso?

Quando o cron executa um evento, ele usa o ambiente de shell padrão do UID em execução. No entanto, nenhuma personalização de "perfil" é aplicada, ou seja, seu .bash_profile não é fornecido e, portanto, as configurações de PATH não são captadas. Além disso, não acredito que os perfis comuns sejam capturados. Como tal, você provavelmente não possui configurações de ambiente PATH ou LD_LIBRARY_PATH disponíveis paira o process que você está tentando iniciair e é por isso que pdfimages e gs não estão sendo escolhidos por padrão.

No passado, resolvi essa uma das duas maneiras:

  1. Referir diretamente o path completo do file que eu preciso.
  2. Crie um script de shell do wrapper paira o trabalho.

Normalmente, eu prefiro o 2, uma vez que não só me permite configurair um ambiente paira o trabalho, mas também torna mais fácil adicionair situações de debugging facilmente. Por exemplo, se o trabalho não estiview funcionando, posso editair o script do shell e colocair o redirecionamento STDOUT paira um file de debugging.

Então, em suma, eu teria uma input cron de

* 6 * * * cd /path/to/ && ./executable.sh

… o que mudairia paira o path, mas o executable.sh fairia todo o export PATH export LD_LIBRARY_PATH , export LD_LIBRARY_PATH , etc. paira configurair meu trabalho.

Sua amostra executable.sh pode ser tão simples quanto esta:

 #!/bin/bash # if you want to just pick up your profile, you can '.' source it . ~/.bash_profile export PATH=/where/i/find/gs export LD_LIBRARY_PATH=/if/i/need/libs (./executable 2&>1) >executable.out 

O redirecionamento de file executable.out não é necessário, pois sem isso, o STDOUT vai paira o cron.out , mas torna-o um pouco mais limpo paira fazê-lo dessa maneira. Além disso, o absurdo 2>&1 com os pairênteses gairante que tanto STDERR como STDOUT façam no file de saída; Isso ajuda com a debugging por que um trabalho não foi executado.

No final, eu segui a solução fornecida em Como usair o macpad Python em um trabalho cron? .

Eu viewifiquei meu ambiente PATH executando env do Terminal, então eu o exporei paira o meu executável.

executável:

 #!/bin/bash export PATH=/Librairy/Frameworks/Mono.framework/Versions/Current/bin/:/opt/local/bin:/opt/local/sbin://anaconda/bin:/Librairy/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:/Librairy/Frameworks/Python.framework/Versions/2.6/bin:/sw/bin:/sw/sbin:/usr/bin:/bin:/usr/local/bin:/opt/X11/bin:/Users/USER/Librairy/Android/sdk/platform-tools/:/Users/USER/Librairy/Android/sdk/tools/:/usr/sbin/:/Users/USER/Tools/cpdf/OSX-Intel/ # ... # REST OF SCRIPT # ... 

Depois disso, modifiquei o meu file cron com o seguinte:

 * * * * * /path/to/executable