Я понимаю, что SO – это вопрос, но независимо от того, сколько учебных пособий я искал, я не могу заставить свой crontab
работать, и я создаю веб-сайт, который будет полагаться на crontab
чтобы каждый раз crontab
конкретную настройку в моей базе данных.
Вот мой файл crontab
:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 am every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # mh dom mon dow command * * * * * /usr/bin/php -q /var/www/html/cron/index.php
Если я попытаюсь cd
к /usr/bin/php
я получу
-bash: cd: /usr/bin/php: Not a directory
Поэтому я cd
'd просто /usr/bin/
и это то, что я нашел:
-rwxr-xr-x 1 root root 27216 Feb 10 15:08 pgrep* lrwxrwxrwx 1 root root 21 Jun 13 09:36 php -> /etc/alternatives/php* -rwxr-xr-x 1 root root 9049256 Jul 2 11:57 php5*
Если я cd
к /etc/alternatives
я нахожу:
lrwxrwxrwx 1 root root 13 Jun 13 09:36 php -> /usr/bin/php5*
Я возвращаюсь к файлу bin
, php5
имеет символ *
и зеленый.
-rwxr-xr-x 1 root root 9049256 Jul 2 11:57 php5*
Мой скрипт PHP. Очень просто. Проверяет файл cookie, и если он существует, он увеличивает его на единицу. Затем я проверяю результаты на другой странице. Вручную это работает. С помощью crontab
вы не можете заставить его работать.
if (!empty($_COOKIE['cronTest'])) { $int = $_COOKIE['cronTest']; $int++; setcookie("cronTest", $int, time()+3600); }
Скорее всего, ваш скрипт внутри /var/www/html/cron
принадлежит пользователю www-data
. В зависимости от вашей установки пользователь, выполняющий cronjob, не имеет разрешений для запуска этого файла.
В командной строке нет $ _COOKIE. Куки-файл отправляется браузером пользователей. Поскольку cli не является браузером, вы не можете прочитать значение cookie. Хотя вы можете получить доступ к пользователям $ _SESSION, но это еще одна история. Посмотрите здесь. Можно ли прочитать значение cookie / session при выполнении скрипта PHP5 через командную строку? для получения дополнительной информации.
Строка cronjob выглядит корректно, поэтому проблема будет одной из вышеперечисленных точек. Чтобы проверить первое, попробуйте что-то без использования $ _COOKIE в вашем файле, например, просто
mkdir('/var/www/html/cron/testdir');
просто посмотреть, доступен ли файл, и создается ли каталог внутри указанного каталога. Если доступ к нему недоступен, создайте новую группу и добавьте как текущего пользователя (узнайте с помощью
ls -al
в / var / www / html / cron) и пользователь, выполняющий cronjob для группы, затем сделайте эту группу собственностью файла, который вы хотите запустить. См. Принятый ответ на этот вопрос: Установите разрешения для пользователей | Команда Artisan не будет работать в коде, но отлично работает в командной строке. Я отправил некоторое время назад о том, как это сделать.
Для проблемы $ _COOKIE вам нужно найти другое решение. Например, используйте Redis или Memcached в качестве службы кэширования, к которой можно получить доступ как в режиме онлайн, так и в настройках cli.
Попробуйте добавить
1>> /dev/null 2>&1
до конца строки cronjob, если вы этого не сделаете, и пусть cron запускает это каждую минуту, вы получите массу лог-файлов.
Ради полного удовлетворения возможных ловушек при работе с php и cli, всегда обеспечивайте полный путь к вашим файлам.