script não está sendo executado como esperado quando agendado como um cronjob

1

Estou tentando escrever um script que identificará imagens jpg corrompidas usando o comando imagemagicks identify. O script irá executar o comando, grep a saída para a palavra "Corrupt", mova-o para uma pasta corrompida se estiver corrompido ou mova-o para uma pasta de entrada se o arquivo aparecer bem.

Meu script funciona como esperado se eu o executar manualmente a partir de uma janela de terminal. Idealmente, eu quero executar este script como uma tarefa do cron, no entanto, quando eu agendar como um cronjob, está movendo tudo para a pasta de entrada ... por isso parece que a instrução IF não está sendo avaliada corretamente. Existe algo diferente que eu preciso fazer com o meu script para que ele funcione como um cronjob?

#!/bin/bash
LANG=en_US.UTF-8

#variables for our folders
DROP_FOLDER=~/Desktop/Drop
CORRUPT_FOLDER=corrupt_images/
INPUT_FOLDER=Input/

cd $DROP_FOLDER
for f in *.jpg
do
    if /opt/ImageMagick/bin/identify -verbose $f | /usr/bin/grep -iq "Corrupt"; then
        mv "$f" $CORRUPT_FOLDER
    else
        mv "$f" $INPUT_FOLDER
    fi
done

Estou agendando em crontab com

*/2 * * * * cd ~ && ./myscript.sh
    
por user257655 18.12.2015 / 04:39

3 respostas

0

Sugiro substituir seu bloco if por:

/opt/ImageMagick/bin/identify -verbose "$f" | /usr/bin/grep -iq "Corrupt"
if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 1 ]]; then
  mv "$f" "$INPUT_FOLDER"
else
  mv "$f" "$CORRUPT_FOLDER"
fi

De man bash :

PIPESTATUS: An array variable (see Arrays below) containing a list of exit status values from the processes in the most-recently-executed foreground pipeline (which may contain only a single command).

    
por 18.12.2015 / 04:55
1

Quando você adiciona seu script como uma tarefa cron, o usuário do cron que executa seu script é diferente da sua conta de usuário normal com a qual você provavelmente testou seu script.
Então, quando este comando

DROP_FOLDER=~/Desktop/Drop

é executado o ~ é expandido para o $HOME do usuário do cron (ou seja, raiz), portanto, você deve substituir DROP_FOLDER=~/Desktop/Drop pelo caminho completo do diretório pretendido.

    
por 18.12.2015 / 05:37
0

Parece que os comandos na condição não funcionam como esperado. Para depurar isso, redirecione a saída e a saída de erro do comando de identidade para um arquivo e observe o que é gravado, por exemplo:

/opt/ImageMagick/bin/identify -verbose $f &> /tmp/debug.log

Depois de ver esta saída, devemos ver mais claro o que está acontecendo.

    
por 18.12.2015 / 07:14