Usando o comando 'which' no cron job

2

Eu tenho um cron job que é executado uma vez por dia em um servidor Linux e, no script que ele executa, há um teste:

# Validate ffmpeg is installed
if [ $(which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
    echo "error: ffmpeg is not installed!" | tee -a "$log"
    exit 1
fi 

Todos os dias, ao verificar o arquivo de log, a mensagem ffmpeg is not installed! está no log e, como resultado, o trabalho não foi executado. Se eu executar o teste which no shell, tudo funciona bem e, quando executo o script, tudo funciona.

Existe algo intrínseco ao cron que o impede de usar corretamente o comando which ?

    
por Neal Bailey 01.04.2013 / 22:55

2 respostas

7

No topo do seu arquivo crontab, coloque a declaração SHELL e PATH como:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Veja este post do SE para mais detalhes.

O padrão SHELL e PATH para o cron são SHELL=/bin/sh , PATH=/usr/bin:/bin (da página man 5 crontab man).

    
por 01.04.2013 / 23:06
5

Provavelmente não pega o seu caminho desde que ele está sendo executado no cron. Existem várias maneiras de fazer com que ele saiba que o caminho mais fácil que encontrei é apenas codificar o caminho para o qual.

Faça um:

locate which

A minha retorna isso:

[user@server ~]$ locate which |grep bin
/usr/bin/which

Em seguida, altere seu script para fazer:

if [ $(/usr/bin/which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
    echo "error: ffmpeg is not installed!" | tee -a "$log"
    exit 1
fi 

Outra opção é definir o ambiente e o caminho no crontab:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
por 01.04.2013 / 23:00