ไปป์ wget ไปยัง / dev / null ใน cron


38

ฉันใช้คำสั่งต่อไปนี้ทุก 5 นาทีใน crontab ของฉันเพื่อให้ Phusion Passenger มีชีวิตอยู่

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

เมื่อฉันเรียกใช้มันจะทำการ wget บนเส้นทาง URL ของไซต์ STDOUT / STDERR ไปยัง / dev / null เมื่อฉันเรียกใช้จากบรรทัดคำสั่งมันทำงานได้ดีและไม่สร้างไฟล์ index.html ในโฮมไดเร็กตอรี่ของฉัน

เมื่อมันทำงานจาก cron มันจะสร้างไฟล์ index.html ใหม่ทุก ๆ ห้านาทีปล่อยให้ฉันมีไฟล์ดัชนีมากมายที่ฉันไม่ต้องการ

ไวยากรณ์ของฉันไม่ถูกต้องสำหรับการรันงาน cron หรือไม่? จากบรรทัดคำสั่งมันทำงานได้โดยไม่มีปัญหา แต่จาก cron มันสร้างไฟล์ index.html ในไดเรกทอรีบ้านของฉัน

ฉันแน่ใจว่าฉันทำผิดพลาดง่ายจะขอบคุณถ้าใครสามารถช่วยออก


1
คำถามอื่นคือสาเหตุที่สิ่งนี้ไม่ได้สร้างไฟล์เมื่อคุณเรียกใช้จากบรรทัดคำสั่งด้วยมือ เท่าที่ฉันสามารถบอกได้จากเอกสารอธิบายความแตกต่างเพียงอย่างเดียวระหว่างการเรียกใช้wgetจากเทอร์มินัลและอย่างอื่นคือว่าแถบความคืบหน้าจะปรากฏขึ้นหรือไม่
Barmar

คำตอบ:


61

คุณสามารถทำสิ่งนี้ได้:

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

ที่นี่-Oจะส่งไฟล์ที่ดาวน์โหลดไปยัง/dev/nullและ-oเข้าสู่ระบบ/dev/nullแทน stderr การเปลี่ยนเส้นทางด้วยวิธีนี้ไม่จำเป็นเลย


1
ขอขอบคุณตรงนี้มากกว่าการเปลี่ยนเส้นทางไปที่ STDERR / STDOUT ฉันรู้สึกทราบซึ้ง.
nulltek

17

คุณต้องการดาวน์โหลดเนื้อหาจริงหรือรับ 200 OK หรือไม่ หากคุณเพียงแค่ต้องให้เซิร์ฟเวอร์ประมวลผลคำขอทำไมไม่ใช้เพียงแค่--spiderโต้แย้ง?


นั่นเป็นความคิดที่ดี ฉันต้องการการตอบสนองที่ 200 OK เท่านั้นจริงๆ
nulltek

ฉันหวังว่าคนที่ไม่มีอคติจะชี้ให้เห็น แต่คุณแก้ปัญหาข้อไหน? คำตอบของฉันเป็นวิธีที่ถูกต้องจริงๆในการทำสิ่งนี้ :)
Nacht - Reinstate Monica

10

ฉันจะใช้สิ่งต่อไปนี้:

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

-O -ตัวเลือกที่จะทำให้แน่ใจว่าเนื้อหาความจริงคือการส่งที่ stdout


4
โปรดทราบว่าถูกเขียนรัดกุมมากเป็นfoo > /dev/null 2>&1 foo &> /dev/null
amalloy

3
@amalloy bashเฉพาะใน ในshซึ่งโดยทั่วไปจะใช้ cron การเปลี่ยนเครื่องหมายและไม่ทำงาน
Soviero

5

คุณพูดว่าคุณต้องการเพียงการตอบสนอง "200 ตกลง" ในความคิดเห็น


wget -O /dev/null -o /dev/null example.comที่ช่วยให้การแก้ปัญหามีข้อได้เปรียบเพิ่มเติมบางกว่าพวก แนวคิดนี้ไม่ใช่การทิ้งเอาต์พุตในทางใดทางหนึ่ง แต่จะไม่สร้างเอาต์พุตใด ๆ เลย

การที่คุณต้องการเพียงการตอบสนองหมายถึงข้อมูลที่ดาวน์โหลดลงในไฟล์ในเครื่อง index.html ไม่จำเป็นต้องดาวน์โหลดตั้งแต่แรก
ในโปรโตคอล HTTP, คำสั่ง 'ได้รับ' ถูกใช้เพื่อดาวน์โหลดเอกสาร ในการเข้าถึงเอกสารในลักษณะที่ทำทุกอย่างยกเว้นการดาวน์โหลดเอกสารจริง ๆ มีคำสั่งพิเศษคือ 'HEAD'
เมื่อใช้ 'GET' สำหรับงานนี้เอกสารจะถูกดาวน์โหลดและทิ้งไว้ในเครื่อง การใช้ 'HEAD' ทำในสิ่งที่คุณต้องการไม่ได้ถ่ายโอนเอกสารตั้งแต่แรก มันจะส่งคืนรหัสผลลัพธ์เดียวกันกับ 'GET' ตามที่นิยามไว้

ไวยากรณ์ที่จะใช้วิธีการHEADที่มีwgetเป็นเพียงเล็กน้อยแปลก: --spiderเราจำเป็นต้องใช้ตัวเลือก ในบริบทนี้มันทำสิ่งที่เราต้องการ - เข้าถึง URL ด้วย 'HEAD' แทนที่จะเป็น 'GET'
เราสามารถใช้ตัวเลือก-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 มีชีวิตอยู่

ขอให้คำถามของคุณเกี่ยวกับเรื่องนี้ได้หน้าเว็บบอกว่า:

เว็บเซิร์ฟเวอร์และแอพพลิเคชันเซิร์ฟเวอร์ที่รวดเร็วและมีประสิทธิภาพสำหรับ

สิ่งนี้ไม่จำเป็นต้องมีสคริปต์แบบ keepalive

มิฉะนั้นโซลูชันของ kasperd จะสมบูรณ์แบบ


ขอบคุณสำหรับคำติชมถึงแม้ว่ามันจะไม่สร้างสรรค์มากนัก แอ็พพลิเคชันเซิร์ฟเวอร์ล้มเหลว - แม้ว่าโดยทั่วไปจะไม่ใช่ความผิดของคอนเทนเนอร์
เฟลิกซ์แฟรงค์

1
ฉันเห็นด้วยว่าไม่ควรต้องการ cronjobs ใด ๆ เพื่อให้มีชีวิตอยู่ แต่มันเป็นการแก้ไขที่รวดเร็วในขณะที่ฉันค้นคว้าการปรับจูน Nginx / ผู้โดยสาร เป็นเพียงแค่มองหาวิธีที่ดีที่สุดในการส่งออกไปยัง / dev / null ฉันเคยมีผู้โดยสารล้มเหลวหรือหยุดเป็นเวลา 2 นาทีในเวลาที่ไม่มีโหลดดังนั้นการขอให้ url ทำให้ผู้โดยสารไม่ทำงาน
nulltek

1
มันจะเป็นการดีที่จะเข้าใจสิ่งที่มันถูกรักษาไว้โดยwgetคำสั่ง ในหลาย ๆ สถานการณ์ความจำเป็นในการรักษาข้อความที่มีชีวิตเป็นอาการของข้อบกพร่องการออกแบบที่ควรแก้ไข แต่แม้ว่าทั้งหมดเหล่านั้นจะได้รับการแก้ไขก็จะยังมีอีกไม่กี่กรณีที่ข้อความที่มีชีวิตเป็นทางออกที่ถูกต้อง แม้ว่าจะไม่จำเป็นต้องเก็บข้อความที่ยังมีชีวิตอยู่งาน cron อาจยังคงเป็นส่วนที่มีประโยชน์ของการตั้งค่าการตรวจสอบ
kasperd

นี่จะเป็นการแสดงความคิดเห็นที่ดีกว่าคำตอบ
moopet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.