«du: команда не найдена» - по заданию CRON

У меня есть камера слежения, которая отправляет снимки, которые она захватывает, на ftp-сервер в моей сети, и я разработал сценарий для удаления старых файлов из принимающего каталога.Сценарий хорошо работает при запуске из командной строки, поэтому я добавил в crontab строку для выполнения сценария дважды в день.

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

Однако сценарий не работал. Каталог наполнялся, поэтому я решил выполнить с #! / Bin / bash -x, чтобы посмотреть, что происходит. На мою почту стали приходить следующие сообщения:

+ 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 и du не обнаруживаются при выполнении скрипта через CRON? Может ли кто-нибудь дать мне некоторое представление о том, почему эти команды работают нормально, когда я выполняю скрипт с терминала, но не когда он выполняется из CRON?

На случай, если это будет полезно, я предоставил сценарий для справки:

#!/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

-

РЕДАКТИРОВАТЬ:

Добавление эха «PATH - $ PATH -» в начало сценарий приводит к тому, что первая строка электронного письма выглядит так: + echo 'PATH - ~ / bin: $ PATH -' . Итак, теперь мои вопросы: что случилось с моим PATH и как рекомендуется добавить в него полезные каталоги? Я предполагаю, что это влияет на все мои работы в CRON.

-

0
12.03.2017, 08:31
2 ответа

Он работает из интерактивного сеанса, поэтому я предполагаю, что это настройка в cron .

Убедитесь, что у вас нет строки PATH = в вашем crontab , если вы это сделаете, она содержит явные каталоги ( cron назначение пути isn не суммируется, как оболочка)

PATH=/home/myhomedir/bin:/usr/local/bin:/bin:/usr/bin
2
28.01.2020, 02:34

Поскольку вывод $ PATH дает ~ / bin: $ PATH , в вашем файле ~ / .bashrc вполне может быть что-то похожее на

PATH='~/bin:$PATH'

Это устанавливает PATH в буквальную строку ~ / bin: $ PATH , в которой из-за одинарных кавычек $ PATH никогда не расширяется до любого пути было до этого задания.

Замените одинарные кавычки на двойные.

0
28.01.2020, 02:34

Теги

Похожие вопросы