cronでwget出力を/ dev / nullにパイピングする


38

Phusion Passengerを存続させるために、crontabで5分ごとに次のコマンドを実行しています。

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

これを実行すると、サイトでwgetが実行され、URLがSTDOUT / STDERRを/ dev / nullにルーティングします。これをコマンドラインから実行すると、正常に機能し、ホームディレクトリにindex.htmlファイルが生成されません。

cronから実行すると、5分ごとに新しいindex.htmlファイルが作成され、大量の不要なインデックスファイルが残されます。

cronジョブを実行するための構文は間違っていますか?コマンドラインからは問題なく動作しますが、cronからはホームディレクトリにindex.htmlファイルが生成されます。

私は単純な間違いを犯していると確信しています。誰かが助けてくれれば感謝しています。


1
別の質問は、コマンドラインから手動で実行したときにファイルが作成されない理由です。ドキュメントからわかる限りwget、ターミナルから実行する場合とそうでない場合の唯一の違いは、プログレスバーが表示されるかどうかです。
バーマー14

回答:


61

次のようにできます:

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

ここで-Oは、ダウンロードしたファイルをstderrの代わりに送信し/dev/null-oログを記録します/dev/null。この方法では、リダイレクトはまったく必要ありません。


1
おかげで、これはSTDERR / STDOUTにリダイレクトするよりも直接的です。それは有り難いです。
nulltek

17

実際にコンテンツをダウンロードする必要がありますか、それとも200 OKを受け取るだけですか?サーバーでリクエストを処理するだけでよい場合、単に--spider引数を使用しないのはなぜですか?


それは良い考えです。本当に必要なのは200 OK応答だけです。
nulltek

私は誰かが公平にそれを指摘することを望んでいましたが、...どのソリューションを使用することになりましたか?私の答えは本当にこの:)を行うための正しい方法である
NACHT -復活モニカ

10

私は次を使用します:

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

この-O -オプションは、フェッチされたコンテンツが標準出力に送信されるようにします。


4
foo > /dev/null 2>&1はとしてより簡潔に記述されていることに注意してくださいfoo &> /dev/null
アマロイ14

3
@amalloyのみbashsh使用をcronではどのような通常、アンパサンドリダイレクトは仕事をしません。
ソビエロ14

5

コメントに「200 OK」応答のみが必要だと言います。

それはのそれらの上のいくつかの追加利点で解決を考慮します
wget -O /dev/null -o /dev/null example.com。何らかの方法で出力を破棄するのではなく、出力をまったく作成しないという考え方です。

応答のみが必要なということは、ローカルファイルindex.htmlにダウンロードされたデータを最初にダウンロードする必要がないことを意味します。
HTTPプロトコルでは、コマンド「GET」を使用してドキュメントダウンロードします。実際にドキュメントをダウンロードする以外のすべてを実行する方法でドキュメントにアクセスするには、特別なコマンド「HEAD」があります。
このタスクに「GET」を使用すると、ドキュメントがダウンロードされ、ローカルで破棄されます。「HEAD」を使用すると、必要なことだけが行われ、最初はドキュメントが転送されません。定義により、「GET」と同じ結果コードが常に返されます。

この方法を使用する構文HEADとはwget少し奇妙です:私たちはオプションを使用する必要があります--spider。このコンテキストでは、必要なことを行うだけです-「GET」ではなく「HEAD」でURLにアクセスします。
オプション-q(静か)を使用して、その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

のコマンドのcrontab場合、両方の場合に出力がないという事実は、エラーの表示として出力を取得しないことを再び使用できることを意味します。

コマンド例は次のように変更されます。

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

これにはと同じ利点がありwget -O /dev/null -o /dev/null example.comます。追加の利点は、ローカルで生成および破棄されるのではなく、ログ出力とドキュメント出力が生成されないことです。または、大きな違いは、ドキュメントをダウンロードして破棄することを回避することindex.htmlです。


私もこのアプローチが好きです。フィードバックと回答に感謝します。
nulltek

3

Phusion Passengerを存続させるため。

あなたの質問がこれについてであるかもしれません、ウェブページは言います:

高速で堅牢なWebサーバーおよびアプリケーションサーバー

これにはキープアライブスクリプトは必要ありません。

それ以外の場合、kasperdのソリューションは完璧です。


非常に建設的ではありませんが、フィードバックをありがとう。アプリケーションサーバーは失敗しますが、通常はコンテナの障害ではありません。
フェリックスフランク14

1
私はそれが生き続けるためにcronジョブを必要とすべきではないことに同意します。しかし、Nginx / Passengerのチューニングを研究している間、それは簡単な修正でした。本当に/ dev / nullに出力するための最良の方法を探していました。乗客に障害が発生したり、負荷がかかっていないときに2分間ハングしたりしたので、URLを要求すると、乗客は今のところ発射され続けます。
nulltek

1
wgetコマンドによって生かされていることを理解するのは良いことです。多くの場合、キープアライブメッセージの必要性は、修正すべき根本的な設計上の欠陥の症状です。しかし、それらすべてが修正されたとしても、キープアライブメッセージが正しい解決策であるいくつかのケースが残っています。キープアライブメッセージが不要な場合でも、cronジョブは監視設定の有用な部分になる可能性があります。
カスペルド14

これは、答えよりもコメントとしてのほうが良いでしょう。
moopet 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.