Передача вывода wget в / dev / null в cron

39

Я запускаю следующую команду каждые 5 минут в моем crontab, чтобы поддерживать Phusion Passenger.

*/5 * * * * wget mysite.com > /dev/null 2>&1

Когда я запускаю это, он выполняет wget на сайте, направляя STDOUT / STDERR в / dev / null. Когда я запускаю это из командной строки, он работает нормально и не создает файл index.html в моем домашнем каталоге.

Когда он запускается из cron, он каждые пять минут создает новый файл index.html, оставляя мне кучу файлов индекса, которые мне не нужны.

Мой синтаксис неверен для запуска задания cron? Из командной строки это работает без проблем, но из cron генерирует файл index.html в моем домашнем каталоге.

Я уверен, что делаю простую ошибку, был бы признателен, если бы кто-нибудь мог помочь.

nulltek
источник
1
Другой вопрос, почему это не создает файл, когда вы запускаете его из командной строки вручную. Насколько я могу судить из документации, единственная разница между запуском wgetс терминала и другим способом заключается в том, отображается ли индикатор выполнения.
Бармар

Ответы:

62

Вы можете сделать это так:

*/5 * * * * wget -O /dev/null -o /dev/null example.com

Здесь -Oотправляет загруженный файл /dev/nullи -oрегистрируется /dev/nullвместо stderr. Таким образом, перенаправление вообще не нужно.

kasperd
источник
2
Спасибо, это более прямое, чем перенаправление на STDERR / STDOUT. Я признателен за это.
nulltek
17

Вам действительно нужно загрузить содержимое или просто получить 200 OK? Если вам нужно, чтобы сервер обработал запрос, почему бы просто не использовать --spiderаргумент?

Nacht - Восстановить Монику
источник
Это хорошая мысль. Мне действительно нужен только ответ 200 OK.
nulltek
Я надеялся, что кто-то непредвзятый укажет на это, но ... какое решение вы в конечном итоге использовали? Мой ответ действительно правильный способ сделать это :)
Nacht - Восстановить Монику
10

Я бы использовал следующее:

/5 * * * * wget -O - mysite.com > /dev/null 2>&1

-O -Вариант гарантирует , что извлеченное содержание отправить на стандартный вывод.

Питер Лэмби
источник
4
Обратите внимание, что foo > /dev/null 2>&1более кратко написано как foo &> /dev/null.
Амаллой
3
@amalloy Только в bash. В sh, который обычно используется cron, перенаправление амперсанда не работает.
Совьеро
5

Вы говорите, что вам нужен только ответ "200 OK" в комментарии.

Это позволяет найти решение с некоторыми дополнительными преимуществами по сравнению с
wget -O /dev/null -o /dev/null example.com. Идея не в том, чтобы отбросить вывод каким-либо образом, но вообще не создавать вывод.

То, что вам нужен только ответ, означает, что данные, загружаемые в локальный файл index.html, не нужно загружать в первую очередь.
В протоколе HTTP команда «GET» используется для загрузки документа . Для доступа к документу способом, который делает все, кроме фактической загрузки документа, существует специальная команда «HEAD».
При использовании «GET» для этой задачи документ загружается и удаляется локально. Использование «HEAD» делает именно то, что вам нужно, оно не передает документ в первую очередь. Он всегда будет возвращать тот же код результата, что и GET по определению.

Синтаксис использования метода HEADс wgetнемного странным: мы должны использовать опцию --spider. В этом контексте он просто делает то, что мы хотим - получить доступ к URL с помощью «HEAD» вместо «GET».
Мы можем использовать опцию -q(quiet), чтобы wgetне выводить подробности о том, что она делает.

Сочетание этого не wgetприведет ни к выводу чего-либо в stderr, ни к сохранению документа.

wget -q --spider 'http://example.com/'

Код выхода сообщает нам, был ли запрос успешным или нет:

$ wget -q --spider 'http://example.com/'
$ echo $?
0
$ wget -q --spider 'http://example.com/nonexisting'
$ echo $?                                          
8

Для команды in crontabтот факт, что в обоих случаях нет выходных данных, означает, что вы можете использовать получение отсутствия выходных данных как указание на ошибки снова.

Ваш пример команды будет изменен на это:

*/5 * * * * wget -q --spider mysite.com

Это имеет те же преимущества, что и wget -O /dev/null -o /dev/null example.com. Дополнительным преимуществом является то, что вывод журнала и вывод документа не генерируются, а генерируются и отбрасываются локально. Или, конечно, большая разница в том, чтобы не загружать, а затем отбрасывать документ index.html.

Volker Siegel
источник
Мне также нравится этот подход. Я ценю ваши отзывы и ответ.
nulltek
3

чтобы сохранить Phusion Passenger.

Пусть ваш вопрос должен быть по этому поводу, веб-страница говорит:

Быстрый и надежный веб-сервер и сервер приложений для

Это не должно требовать никаких сценариев keepalive.

В противном случае решение Касперда идеально.

user237113
источник
Спасибо за отзыв, хотя он не очень конструктивный. Серверы приложений терпят неудачу - хотя обычно это не ошибка контейнера.
Феликс Фрэнк
1
Я согласен, что не нужно никаких cronjobs, чтобы поддерживать его. Но это было быстрое решение, пока я изучал настройку Nginx / Passenger. На самом деле просто искал лучший способ вывода в / dev / null. У меня был сбой пассажира или зависание в течение 2 минут в то время, когда он не загружен, поэтому запрос URL пока держит пассажира в огне.
nulltek
1
Было бы хорошо понять, что wgetкоманды поддерживают в живых . Во многих ситуациях необходимость поддерживать сообщения в актуальном состоянии является признаком основного недостатка проекта, который следует устранить. Но даже если все они исправлены, все равно останется несколько случаев, когда сообщение поддержания активности является правильным решением. Даже если сообщения поддержания активности не нужны, задание cron может быть полезной частью настройки мониторинга.
Касперд
Это было бы лучше в качестве комментария, чем ответа.
moopet