Назад | Перейти на главную страницу

Условия IF Linux Bash не обрабатываются при запуске от имени crontab

Итак, я сделал себе небольшой скрипт, который отслеживает мои обслуживаемые каталоги на предмет любых изменений файлов PHP. Он предназначен для запуска каждые 5 минут из crontab и отправки мне по электронной почте любых изменений, чтобы я мог их проверить.

На машине работает множество веб-сайтов, и я хочу иметь возможность следить за любыми новыми сценариями, чтобы убедиться, что там нет ничего, что мне не нравится, если вы понимаете, о чем я.

Проблема в том, что сценарий работает на 100% нормально, когда я запускаю его из командной строки, но он не запускается правильно из crontab. Сценарий приведен ниже:

rm /root/sec/email
find /var/www/ -name '*.php' -not -name '*.tpl.*' -type f -mtime -0.005 -exec ls -al {} \;  > /root/sec/email
if [[ -s /root/sec/email ]] ; then
        mail -s "PHP Change Alert on FSE4" matt@aroxo.com muji@aroxo.com < /root/sec/email
        echo "It ran" >> /root/sec/log
else
        echo "It did not run" >> /root/sec/log
fi ;

Проблема в условии IF. Даже если файл с именем "email" имеет ненулевой размер, срабатывает неправильная сторона предложения if (else).

Есть идеи, что я делаю не так?

Привет,

Мэтт.

В скрипте есть замысел: [[

Другими словами, скрипт использует нестандартное расширение синтаксиса оболочки Bourne, которое нарушает скрипт, когда он запускается /bin/sh (Я предполагаю, что ваш дистрибутив использует /bin/sh который не поддерживает все не-POSIX bashisms в нем).

Чтобы решить эту проблему, либо

  1. Ставить #!/bin/bash в первой строке скрипта
  2. Сделайте условие if таким: if [ -s "/root/sec/email" ] ; then

Дополнительная информация о башизмах здесь: http://mywiki.wooledge.org/Bashism

Crontab по умолчанию использует / bin / sh для выполнения ваших команд.

Несмотря на то, что / bin / sh является символической ссылкой на / bin / bash, bash отключает функции только для bash, если он работает таким образом.

Согласно 'man 5 crontab', вы можете поместить 'SHELL = / bin / bash' в новую строку в вашем файле crontab, и внезапно функции bash снова заработают, например, ваш оператор «if [[...]]» .