O script geralmente funciona, mas não com o cron

1

Eu tenho um script que se parece com isso:

#!/bin/bash

D=~/brew\ update

num=$(ls "$D" | cut -d ' ' -f 2 | sort -nr | head -1)
num=$(( num + 1 ))

script -q "$D/brew_update $num" brew update

Esse script sempre funciona, mas quando eu inicio com o cron 0 */5 * * * ~/bin/brewupdate2 , ele diz isso em um arquivo em /var/mail

^Dscript: brew: No such file or directory

Então, achei que usava sh , mas tentei sh ~/bin/brewupdate2 e ele foi executado sem erros.

    
por DisplayName 10.11.2015 / 21:56

2 respostas

4
 D=~/brew\ update
 # the above will never work unless you start script as you
 # say you are user fred, this full path will always work
 D=/home/fred/brew\ update

Cron trabalha com diferentes permissões e PATH do que usuário, em outras palavras o cron basicamente é seu próprio usuário (root), com seu próprio PATH etc. Não use ~ /, que se refere a outro diretório home, não ao seu, quando O cron inicia o job, que ~ / é relativo ao diretório home do usuário no sistema que inicia o job (root, neste caso). Use o caminho completo para 'atualizar brew' (e se você puder, se livrar desse nome de diretório com o espaço nele, se estiver sob seu controle). Eu não tenho ideia do que o cron faz com ~ / em termos de gerar um caminho porque ele nunca funcionará de maneira previsível, então eu nunca pensei sobre isso.

Com o cron, use SEMPRE os caminhos completos do sistema ou você receberá esses tipos de erros.

Em serverfault :

what user will [cron] run as?

They all run as root. If you need otherwise, use su in the script or add a crontab entry to the user's crontab (man crontab) or the system-wide crontab (whose location I couldn't tell you on CentOS).

Então, em teoria, você poderia usar ~ / que se traduziria na raiz do root, / root /, mas isso é uma péssima idéia sobre a legibilidade e testes, etc.

[update] Como foi dito, o problema aqui era 'brew' estar em / usr / local / bin, que não está no $ PATH do cron, que fez o comando 'brew' falhar, arquivo não encontrado. Eu perdi a última linha. Mas mais uma razão para usar sempre caminhos completos. Caminhos completos em todos os programas e arquivos resolverão todos esses problemas.

    
por 10.11.2015 / 22:05
0

Como foi mencionado na resposta do @ Lizardx, a variável de ambiente PATH provavelmente será diferente da sua conta de usuário. O erro que você está vendo indica que script não conseguiu encontrar o comando brew :

brew: No such file or directory

A maneira mais simples de corrigir o erro é especificar o caminho exato do comando alimentado para script :

script -q "$D/brew_update $num" /usr/local/bin/brew update
    
por 10.11.2015 / 22:57

Tags