Итак, я сделал себе небольшой скрипт, который отслеживает мои обслуживаемые каталоги на предмет любых изменений файлов 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 в нем).
Чтобы решить эту проблему, либо
#!/bin/bash
в первой строке скрипта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 [[...]]» .