“du: comando não encontrado” - pelo trabalho CRON

0

Eu tenho uma câmera de segurança que envia imagens capturadas para um servidor FTP na minha rede e desenvolvi um script para cortar os arquivos antigos do diretório de recebimento. O script funciona bem quando iniciado a partir da linha de comando, então eu adicionei uma linha ao crontab para executar o script duas vezes por dia.

# Remove old security images / videos from directory
1       7,19    *       *       *               /home/ftp/bin/secpurg

O script não estava funcionando. O diretório estava ficando cheio, então eu decidi executar com #! / Bin / bash -x para ver o que estava acontecendo. As seguintes mensagens começaram a aparecer no meu e-mail:

+ fileAge=10
+ SecDir=/home/ftp/_Security/
+ maxDirSize=3000000
++ du -s /home/ftp/_Security/
++ cut -f1
/home/ftp/bin/secpurg: line 11: cut: command not found
/home/ftp/bin/secpurg: line 11: du: command not found
+ secDirSize=
+ '[' -ge 3000000 ']'
/home/ftp/bin/secpurg: line 14: [: -ge: unary operator expected

Hu? 'cut' e 'du' não são encontrados ao executar o script via CRON? Alguém pode me fornecer algumas dicas sobre por que esses comandos funcionam bem quando eu executo o script de um terminal, mas não quando ele é executado a partir de CRON?

Caso seja útil, forneci o script para referência:

#!/bin/bash -x
# secpurg - find and remove older security image files.

# Variable decleration
fileAge=10
SecDir="/home/ftp/_Security/"
maxDirSize=3000000

# Determine the size of $SecDir
secDirSize='du -s $SecDir | cut -f1'

# If the size of $SecDir is greater than $maxDirSize ...
while [ $secDirSize -ge $maxDirSize ]
do
        # remove files of $fileAge days old or older ...
        find $SecDir* -mtime +$fileAge -exec rm {} \;

        # Generate some output to email a report when files are deleted.
        # set -x

        # Expanding $SecDir* makes for big emails, so we don't do that, but echo the command for reference ...
        echo -e "\t\t[ $secDirSize -ge $maxDirSize ] 
                fileAge=$fileAge
                SecDir=$SecDir
                maxDirSize$maxDirSize
                find $SecDir* -mtime +$fileAge -exec rm {} \;"

        # decrement $fileAge ...
        fileAge=$(( $fileAge - 1 ))

        # and re-determine the size of $SecDir.
        secDirSize='du -s $SecDir | cut -f1'

        # Just in case things are crazy, don't delete todays files.
        if [ $fileAge -le 1 ]
        then
                secDirSize=0
        fi

        # Stop generating output for email.
        # set +x        
done

-

EDITAR:

Adicionar echo "PATH -$PATH-" à parte superior dos resultados do script na primeira linha do email é: + echo 'PATH -~/bin:$PATH-' . Então agora minhas perguntas são, o que aconteceu com o meu PATH, e qual é a maneira recomendada de adicionar diretórios úteis a ele? Eu suponho que isso está afetando todos os meus trabalhos CRON.

-

    
por DrDR 12.03.2017 / 06:15

2 respostas

2

Funciona a partir de uma sessão interativa, então eu suporia que é uma configuração em cron .

Verifique se você não tem uma linha PATH= no seu crontab ; se você fizer isso, ela conterá diretórios explícitos (a designação do caminho cron não é aditiva como o shell)

PATH=/home/myhomedir/bin:/usr/local/bin:/bin:/usr/bin
    
por 12.03.2017 / 10:20
0

Como o eco $PATH~/bin:$PATH , é possível que você tenha algo no arquivo ~/.bashrc semelhante a

PATH='~/bin:$PATH'

Isso define PATH como a string literal ~/bin:$PATH na qual, por causa das aspas simples, $PATH nunca é expandido para qualquer que seja o caminho antes dessa atribuição.

Altere as aspas simples para aspas duplas.

    
por 12.03.2017 / 08:53

Tags