Cron работает, но функциональность не работает - PullRequest
6 голосов
/ 08 октября 2010

У меня есть несколько PHP-файлов для запуска cron. Я установил крон, используя команду-

crontab crontab.txt

Внутри файла crontab.txt я написал такие команды cron: -

#(Updating tutor activities) - every minute
* * * * * /usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php

Но ни одна из функций не работает (запросы к базе данных, отправка писем с напоминаниями и т. Д.). Запуск URL-адресов вручную работает.

Затем я положил свой почтовый адрес в MAILTO и получил письма. По почте я получил весь исходный HTML-код страницы. Что ожидается в почте? Почему мои функции не работают?

Обновление
Если я изменю свои команды cron на

 #(Updating tutor activities) - every minute
    * * * * * /usr/bin/wget http://project/cron/tutor_activities.php

Все еще безуспешно, и это приходит в мою почту -

--15:03:01--  http://project/cron/tutor_activities.php
          => `tutor_activities.php'
Resolving project... IP Address
Connecting to test.project|IP Address|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://project./ [following]
--15:03:01--  http://project./
          => `index.html.1'
Resolving project.... IP Address
Connecting to project.|IP Address|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://project/home/ [following]
--15:03:01--  http://project/home/
          => `index.html.1'
Resolving project... IP Address
Connecting to wproject|IP Address|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
index.html.1 has sprung into existence.
Retrying.

И в корне моего проекта накапливается множество файлов index.html.1, index.html.2. Я не хочу, чтобы эти файлы были созданы. Просто хочу, чтобы файлы выполнялись.

Те же результаты, если я использую любую из двух команд -

   * * * * * /usr/bin/wget http://project/cron/tutor_activities.php

   * * * * * wget http://project/cron/tutor_activities.php

команда php с установленным MAILTO отправляет мне эту ошибку / bin / sh: php: команда не найдена.

* * * * * php /path/to/test.php

Итак, я не могу использовать команду php.

Я написал простой mailto() в моем test.php. Почта не приходит при запуске через cron (с ошибками wget и php), но работает URL-адрес вручную.

Моя проблема
Чтобы было еще раз, моя главная проблема в том, что функциональность внутри файлов cron не работает. Создание файлов является второстепенной проблемой.

Буду признателен за любую помощь

Спасибо
Sandeepan

Ответы [ 7 ]

7 голосов
/ 18 октября 2010

попробуй

который php

Возвращаемый путь следует указывать с помощью команды, которая передается для запуска файла Cron. Если вы настраиваете Cron через Shell, это не вызовет никаких проблем, но для уверенности попробуйте указать абсолютный путь когда вы пытаетесь запустить страницу php.

/ path / to / php / path / to / cron / script /

Попытайтесь указать свою команду следующим образом, если проблема не устранена, не стесняйтесь обсуждать.

7 голосов
/ 08 октября 2010

если вы хотите назвать URL-адрес cronjob, вам придется использовать что-то вроде wget . если это php-скрипт на вашем сервере, было бы проще использовать php /...pathtomyscript.../cron/tutor_activities.php

1 голос
/ 18 октября 2010

Я сам нашел проблему. Я не поместил тот же URL в файл crontab, который я запускал вручную, и это была моя ошибка.

При запуске вручную я просто набирал test в URL, появлялся список сохраненных URL моих браузеров, и я выбирал URL http://www.test.project.com/cron/tutor_activities.php, но в файле crontab я поместил http://test.project.com/cron/tutor_activities.php. Я ошибочно предполагал, что это запустит http://www.test.project.com/cron/tutor_activities.php (потому что у нас есть правило перезаписи для добавления www)

Но правило переписывания перенаправляло его на http://www.test.project.com/home. Вот почему содержание HTML в письмах.

Итак, самое важное, что нужно учить здесь, это убедиться, что мы не упускаем мелкие моменты и не предполагаем, что все сделали правильно. В моем случае лучше скопировать и вставить рабочий URL в файл cron.

1 голос
/ 16 октября 2010

Вполне возможно, что PHP не находится в пути в среде cron - он определенно не будет иметь такую ​​же настройку, как ваша обычная оболочка. Попробуйте использовать абсолютный путь к ОБА интерпретатору php и сценарию php в команде cron:

* * * * * /path/to/php /path/to/test.php

Что касается создания файлов, вам просто нужно добавить редирект к вашей команде wget:

wget -O - ... http://....     > /dev/null

-O - заставляет wget записывать все, что он загружает, в стандартный вывод, который cron с радостью отправит вам по электронной почте. Добавив > /dev/null в конце команды, вы получите вместо этого Большое битбакет в небе. Если вы не хотите, чтобы вывод wget по умолчанию отправлялся по электронной почте, вы также можете добавить 2&>1 после /dev/null, который дополнительно перенаправляет stderr в stdout, который теперь идет в /dev/null.

1 голос
/ 12 октября 2010

Если ваш PHP запущен из cron / командной строки, убедитесь, что вы указали полный путь к исполняемому файлу php

1 голос
/ 08 октября 2010

Когда вы вызываете wget с помощью -O - , он отправляет загруженный контент на стандартный вывод, который cron отправляет вам по электронной почте.В первом случае он делает именно то, что должен.

Когда вы вызываете wget без параметра -O , он попытается сохранить загруженный контент в файл с тем же именем, что изагружаемая веб-страница.Если он существует, он добавит инкремент к имени, как вы видели.Во втором случае он делает именно то, что должен.

Из вашего вопроса неясно, куда вы хотите направить вывод, но если вы хотите каждый раз сохранять вывод в один и тот же файл, используйте -O myfilename.html .

0 голосов
/ 16 октября 2010

Простой и безопасный (без tmp-файлов) способ сделать это - использовать подстановку процессов в bash:

* * * * * bash -c "/path/to/php <(/usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php)"

Подстановка процесса запускает команду в <() и помещает выходные данные в объект файла, который виден только из текущего процесса. Чтобы использовать его из cron, вызовите bash напрямую и передайте его как командную строку.

И, как уже упоминали другие, используйте полный путь к php, который вы можете узнать с помощью which php.

...