1

Моя цель - создать скрипт, который я смогу выполнить с помощью задания cron.

Сценарий должен найти несколько файлов killstat.php в нескольких каталогах и выполнить их.

Это то, что я до сих пор:

#!/bin/bash
NAMETOFIND=$(find /home/ -name "killstat.php")
for i in $NAMETOFIND; do /usr/bin/php -f $i;
done

killstat.php должен быть выполнен для сброса моей статистики. Но, похоже, файл php не выполняется. Когда я меняю ключ -f на -l (проверка синтаксической ошибки), скрипт работает нормально!

Выполнение php killstat.php из CLI также работает нормально и сбрасывает статистику. Я работаю с правами root, а также killstat.php, и мой скрипт принадлежит root. Сценарий chmod для 4755

Решение предоставлено Hastur с крошечной переделкой.

Я помещаю этот скрипт в /etc/cron.monthly для сброса моей статистики.

#!/bin/bash
find /home -name "killstat.php"  | while read i
do
  Cdir=$(dirname "$i")
  Cname=$(basename "$i")     # This line can be avoided..
  cd "$Cdir"
  /usr/bin/php -f "$Cname";  # ...if here you use killstat.php [1]
  cd -
done

1 ответ1

1

У вас должны быть проблемы, когда у вас есть пробелы в path к найденным файлам.
Попробуйте с чтением цикла while read do ... done :

#!/bin/bash
find /home/ -name "killstat.php"  | while read i
do 
  /usr/bin/php -f "$i";
done

Обратите внимание на двойные кавычки " в /usr/bin/php -f "$i";


В случае, если ваш скрипт должен запускаться с его места

#!/bin/bash
find /home/ -name "killstat.php"  | while read i
do 
  Cdir=$(dirname "$i")
  Cname=$(basename "$i")     # This line can be avoided...
  cd "$Cdir"
  /usr/bin/php -f "$Cname";  # ...if here you use killstat.php [1]
  cd -
done

Еще раз обратите внимание на двойную кавычку для $i на тот случай, если в строке каталога есть пробелы.
Двойные значения не нужны для $Cname так как вы знаете, что в данном случае это killstat.php .
[1] Вы можете поместить непосредственно killstat.php вместо $Cname и избегать записи всех строк с Cname в сценарии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .