Piping keluaran wget ke / dev / null di cron

39

Saya menjalankan perintah berikut setiap 5 menit di crontab saya untuk menjaga agar Penumpang Phusion tetap hidup.

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

Ketika saya menjalankan ini melakukan wget di url situs rute STDOUT / STDERR ke / dev / null. Ketika saya menjalankan ini dari baris perintah berfungsi dengan baik dan tidak menghasilkan file index.html di direktori home saya.

Ketika dijalankan dari cron, ia menciptakan file index.html baru setiap lima menit, meninggalkan saya dengan satu ton file indeks yang tidak saya inginkan.

Apakah sintaksis saya salah untuk menjalankan pekerjaan cron? Dari baris perintah berfungsi tanpa masalah tetapi dari cron menghasilkan file index.html di direktori home saya.

Saya yakin saya membuat kesalahan sederhana, akan sangat menghargai jika ada yang bisa membantu.

nulltek
sumber
1
Pertanyaan lain adalah mengapa ini tidak membuat file ketika Anda menjalankannya dari baris perintah dengan tangan. Sejauh yang saya tahu dari dokumentasi, satu-satunya perbedaan antara menjalankan wgetdari terminal dan sebaliknya adalah apakah bilah kemajuan ditampilkan.
Barmar

Jawaban:

62

Anda bisa melakukannya seperti ini:

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

Di sini -Omengirim file yang diunduh ke /dev/nulldan -olog ke /dev/nullbukan stderr. Dengan demikian pengalihan tidak diperlukan sama sekali.

kasperd
sumber
2
Terima kasih, ini lebih langsung daripada mengarahkan ke STDERR / STDOUT. Saya menghargainya.
nulltek
17

Apakah Anda perlu mengunduh isinya atau hanya menerima 200 OK? Jika Anda hanya perlu meminta server untuk memproses, mengapa tidak menggunakan --spiderargumen saja?

Nacht - Pasang kembali Monica
sumber
Itu pemikiran yang bagus. Saya benar-benar hanya perlu 200 respon OK.
nulltek
Saya berharap seseorang yang tidak memihak akan menunjukkannya, tapi ... solusi mana yang akhirnya Anda gunakan? Jawaban saya benar-benar cara yang benar untuk melakukan ini :)
Nacht - Reinstate Monica
10

Saya akan menggunakan yang berikut ini:

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

The -O -pilihan memastikan bahwa konten diambil adalah mengirim ke stdout.

Peter Lamby
sumber
4
Catatan yang foo > /dev/null 2>&1lebih ringkas ditulis sebagai foo &> /dev/null.
amalloy
3
@amalloy Hanya di bash. Di sh, yang biasanya digunakan cron, pengalihan ampersand tidak berfungsi.
Soviero
5

Anda mengatakan Anda hanya perlu respons "200 OK" dalam komentar.

Itu memungkinkan solusi dengan beberapa keunggulan tambahan dibandingkan dengan
wget -O /dev/null -o /dev/null example.com. Idenya bukan untuk membuang output dengan cara tertentu, tetapi tidak membuat output sama sekali.

Bahwa Anda hanya memerlukan respons berarti data yang diunduh ke file index.html lokal tidak perlu diunduh terlebih dahulu.
Dalam protokol HTTP, perintah 'GET' digunakan untuk mengunduh dokumen . Untuk mengakses dokumen dengan cara yang melakukan segalanya kecuali benar-benar mengunduh dokumen, ada perintah khusus 'KEPALA'.
Saat menggunakan 'GET' untuk tugas ini, dokumen diunduh dan dibuang secara lokal. Menggunakan 'KEPALA' tidak hanya apa yang Anda butuhkan, itu tidak mentransfer dokumen di tempat pertama. Ini akan selalu mengembalikan kode hasil yang sama seperti 'GET', menurut definisi.

Sintaks untuk menggunakan metode HEADdengan wgetsedikit aneh: kita perlu menggunakan opsi --spider. Dalam konteks ini, ia hanya melakukan apa yang kita inginkan - mengakses URL dengan 'KEPALA' bukan 'GET'.
Kita dapat menggunakan opsi -q(diam) untuk wgettidak menampilkan detail tentang apa yang dilakukannya.

Menggabungkannya, wgettidak akan menghasilkan apa pun untuk stderr, atau menyimpan dokumen.

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

Kode keluar memberi tahu kami apakah permintaan berhasil atau tidak:

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

Untuk perintah dalam crontab, fakta bahwa tidak ada output dalam kedua kasus berarti Anda dapat menggunakan tidak mendapatkan output sebagai indikasi kesalahan lagi.

Contoh perintah Anda akan diubah menjadi ini:

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

Ini memiliki kelebihan yang sama dengan wget -O /dev/null -o /dev/null example.com. Keuntungan tambahan adalah bahwa output log, dan output dokumen, tidak dihasilkan, bukan dihasilkan dan dibuang secara lokal. Atau tentu saja perbedaan besar adalah menghindari mengunduh dan kemudian membuang dokumen index.html,.

Volker Siegel
sumber
Saya suka pendekatan ini juga. Saya menghargai umpan balik dan jawaban Anda.
nulltek
3

untuk menjaga agar Penumpang Phusion tetap hidup.

Mungkin pertanyaan Anda seharusnya tentang ini, halaman web mengatakan:

Server web dan server aplikasi yang cepat dan tangguh untuk

Ini seharusnya tidak memerlukan skrip keepalive.

Kalau tidak, solusi kasperd sempurna.

pengguna237113
sumber
Terima kasih atas umpan baliknya, meskipun tidak terlalu konstruktif. Server aplikasi gagal - meskipun biasanya bukan kesalahan penampung.
Felix Frank
1
Saya setuju bahwa seharusnya tidak memerlukan cronjobs untuk tetap hidup. Tapi itu adalah perbaikan cepat sementara saya meneliti penyetelan Nginx / Penumpang. Benar-benar hanya mencari cara terbaik untuk output ke / dev / null. Saya mengalami kegagalan penumpang atau menggantung selama 2 menit pada saat tidak ada beban, jadi meminta url membuat penumpang tetap bersemangat untuk saat ini.
nulltek
1
Akan lebih baik untuk memahami, apa yang dijaga agar tetap hidup oleh wgetperintah. Dalam banyak situasi, kebutuhan untuk menjaga pesan tetap hidup adalah gejala cacat desain yang mendasarinya yang harus diperbaiki. Tetapi bahkan jika semua itu diperbaiki, masih akan ada beberapa kasus di mana pesan tetap hidup adalah solusi yang tepat. Bahkan jika menjaga pesan tetap tidak diperlukan, pekerjaan cron masih bisa menjadi bagian yang berguna dari pengaturan pemantauan.
kasperd
Ini akan lebih baik sebagai komentar daripada jawaban.
moopet