Запуск php-скрипта с помощью cron: не удалось открыть файл журнала, поэтому такой файл или каталог

У меня есть Raspberry Pi, настроенный как ящик для семян. У меня есть задание cron, которое будет запускаться каждые 10 минут, проверять готовые файлы с помощью transmission-remote -l, grep для выполненных записей (100%), получать имена папок, копировать их на внешний диск, а затем удалять исходные файлы. на моем Пи.

Для каждого выполненного действия (добавление торрента, завершение торрента, начало передачи файла, завершение передачи файла и удаление файлов) запись записывается в мой logfile.log, который находится в том же каталоге как и все скрипты, «/home/pi/dev/». Внутри этой папки у меня есть подпапка logs, в которой хранятся файлы журналов обо всех перемещениях с pi на внешний диск. Все эти файлы журналов названы в честь перемещаемой папки/файла.

Как я уже сказал, каждые 10 минут torrentfinished.phpисполняется задание cron.

*/10 * * * * php -f /home/pi/dev/torrentfinished.php

Все результаты работы отправляются на мою почту /var/mail/pi.

Теперь, если я запускаю скрипт вручную, я могу запустить его из любого места, написав

php -f /home/pi/dev/torrentfinished.php

У меня есть несколько строк отладки, написанных прямо под выполнением каждой команды. (Я использую shell_exec для запуска команд, потому что мне удобнее писать на php, чем на bash).

Он выведет

Started transfer
Wrote transfer to logfile

Затем в logfile добавляется запись с текстом $timestamp : started transfer of data from torrent $torrentname. Отдельный файл создается в logs/$torrentname.log. В принципе, все работает идеально.

Однако, когда задание cron запускается, я получаю следующий вывод в /var/mail/pi

Unable to open logfile: No such file or directory
Started transfer
Wrote transfer to logfile

Но, как вы, наверное, догадались, ничего не происходит. Файлы остаются на своем месте на Pi и не передаются. Кроме того, в logfile или logs/$torrentname.log ничего не записывается.

Я ломал голову над этим и использовал chmod 777 для большего количества файлов, чем можно было бы считать необходимым или безопасным, просто чтобы убедиться, что это не проблема с разрешениями. Может я что-то и упустил, конечно, но вряд ли. Я также пытался переименовать файл logfile во что-то другое, но все равно получаю ту же ошибку.

У меня больше нет идей, что делать, поэтому, если у кого-то из вас есть идеи, пожалуйста, расскажите!


person user2687408    schedule 09.10.2014    source источник


Ответы (2)


Когда вы используете это:

php -f /home/pi/dev/torrentfinished.php

Вы остаетесь в каталоге /home/pi/dev/. И лог-файл записывается в /home/pi/dev/logs

Когда вы запускаете скрипт в cron, базовым каталогом является другой (например, это может быть /bin или /usr/bin).

Попробуйте использовать константы DIR или FILE, чтобы указать путь к файлу журнала.

person Yuriy Kolbasinskiy    schedule 09.10.2014
comment
Это звучит правдоподобно. Я попробую добавить $logfile = "/home/pi/dev/logfile";, посмотрим, изменится ли что-нибудь - person user2687408; 09.10.2014
comment
Да, это решило это. После небольшого возни и проверки каждого файла на наличие опечаток он наконец работает. Спасибо. - person user2687408; 10.10.2014

Это может помочь увидеть фактический код php. Моим первым шагом здесь было бы заставить код напечатать путь к logfile, чтобы я мог понять, почему он думает, что его не существует (используете ли вы относительный путь или какую-то переменную среды, потому что cron имеет тенденцию работать в санированной среде) .

person Stuart    schedule 09.10.2014
comment
Хм, как мне заставить его печатать путь к файлу журнала, который он ищет? - person user2687408; 09.10.2014