root@xx:/var/www/test# which php /usr/bin/php
root@xx:/var/www/test# ls -la total 16 drwxrwxrwx 2 root root 4096 Nov 14 09:37 . drwxrwxrwx 6 root root 4096 Nov 13 15:51 .. -rwxrwxrwx 1 root root 153 Nov 14 09:35 test.php
Это мой файл test.php
:
<?php $my_file = 'file.txt'; $handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file); //implicitly creates file
И это результат работы crontab -l
:
#this is ok * * * * * touch /tmp/hello #this only creates an empty php_result.log * * * * * /usr/bin/php /var/www/test/test.php > /tmp/php_result.log
root@xx:/var/www/test# php -v PHP 5.4.34-0+deb7u1 (cli) (built: Oct 20 2014 08:50:30)
Задача cron не запускается, и проблема связана с php. Если я запускаю файл вручную, все работает хорошо.
php test.php
Связанный вопрос: Почему crontab не выполняет мой PHP-скрипт? ,
Вы должны использовать полные пути в своих сценариях. В противном случае cron
не будет знать, где этот файл.
поэтому вместо
$my_file = 'file.txt';
использование
$my_file = '/path/to/file.txt';
Вероятно, вы получали file.txt
где-то в /
.
Обратите внимание, что crontab
работает в ограниченной среде, поэтому он не может предполагать ничего относительно путей. Вот почему вы также должны предоставить полный путь php
и т. Д.
От устранения общих проблем с заданиями cron :
Использование относительных путей. Если ваше задание cron выполняет какой-либо скрипт, вы должны обязательно использовать только абсолютные пути внутри этого скрипта. Например, если ваш скрипт находится в /path/to/script.phpand, вы пытаетесь открыть файл с именем file.php в том же каталоге, вы не можете использовать относительный путь, например fopen (file.php). Файл должен быть вызван из его абсолютного пути, например: fopen (/path/to/file.php). Это связано с тем, что задания cron не обязательно запускаются из каталога, в котором находится скрипт, поэтому все пути должны быть вызваны специально.