Cronjob по электронной почте "команда завершилась со статусом выхода 1", когда ничего не происходит - PullRequest
1 голос
/ 12 июля 2011

Я недавно экспериментировал с cronjobs и настроил его так:

кронтаб:

SHELL=/bin/sh
MAILTO=me@me.com
26 11 * * * wget http://diruser:pass@domain.com/path/to/file.php

Внутри php-файла он запускает SQL-запрос, который в данный момент просто выполняет вставку. Это работает нормально и запускает вставку, но когда я смотрю на электронное письмо, которое оно выдает, оно говорит следующее:

Адрес электронной почты:

wget http://diruser:pass@domain.com/path/to/file.php:

Команда не выполнена с состоянием выхода 1

Мне было просто интересно, если кто-нибудь знает, почему он вернул команду неудачно? Очевидно, что это не сбой, но ответ по электронной почте заставляет меня думать, что я где-то сделал что-то не так.

Кроме того, рекомендуется ли помещать файл, вызываемый cron, в защищенный паролем каталог, или есть лучший способ его обойти (например, проверка того, что ip запроса - это запрос сервера или чего-то еще).

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Скорее всего, wget выдает ошибку, поскольку не может сохранить результат.По умолчанию wget будет пытаться сохранить результат на диске.При запуске в задании cron рабочий каталог (обычно) /.Вы, как пользователь, вероятно, не можете сохранить файл там.

Вместо этого, скажите wget, чтобы отбросить результат, или направьте его на /dev/null.Пример лисы:

wget -O - -q http://diruser:pass@domain.com/path/to/file.php
0 голосов
/ 12 июля 2011

Попробуйте:

26 11 * * * /usr/local/bin/wget "http://diruser:pass@domain.com/path/to/file.php" > /dev/null 2>&1

Или

26 11 * * * /usr/bin/wget "http://diruser:pass@domain.com/path/to/file.php" > /dev/null 2>&1

1. Для запуска crontab необходим полный путь к команде

2. wget попытается сохранить ответ file.php, если у него нет необходимых разрешений, произойдет сбой. Вот почему вы должны перенаправить вывод куда-то еще, кроме файла, что достигается с помощью > /dev/null.

Существует три стандартных источника ввода и вывода для программы, то есть STDIN, STDOUT, STDERR, соответственно пронумерованных как 0, 1, 2.

Когда вы перенаправляете вывод с помощью значения, превышающего >, если вы не указали явно, какой из них вы хотите перенаправить, по умолчанию будет STDOUT (1). Таким образом, мы перенаправим все выходные данные STDOUT в ноль / корзину и все ошибки 2>&1 в STDOUT, которые, в свою очередь, перейдут в корзину, как указано в предыдущем правиле.

0 голосов
/ 12 июля 2011

Понятия не имею, почему выдается ошибка. Но, на мой взгляд, нехорошо называть PHP через wget. Вы можете написать PHP-скрипт, который не будет доступен через Apache (или Nginx или другой HTTP-сервер) и может быть вызван из cron:

SHELL=/bin/sh
MAILTO=me@me.com
26 11 * * * php /path/to/file.php

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

...