วิธีกำหนดเวลางานเซิร์ฟเวอร์อย่างชาญฉลาดกว่าด้วย cron


15

ฉันทำงานทุกนาทีเพื่อทำดัชนีเนื้อหาของเว็บไซต์อีกครั้ง

วันนี้เสิร์ชเอ็นจิ้นเสียชีวิตและเมื่อฉันเข้าสู่ระบบมีกระบวนการกำพร้าหลายร้อยรายการที่เริ่มโดย cron

มีวิธีการใช้ซอฟต์แวร์ที่มีอยู่บางประเภทที่จะให้ฉันทำงานทุกนาที แต่จะไม่เปิดตัวอินสแตนซ์อื่นหากงานนั้นไม่ส่งคืน (เช่นเนื่องจากกระบวนการของเครื่องมือค้นหาล้มเหลว)


4
cron น่าจะทำสิ่งที่คุณบอก ฉันแนะนำให้เขียนใหม่อย่างชาญฉลาดแทน
ร่าเริง

คำตอบ:


27

ปัญหาไม่ได้อยู่ที่ cron แต่เป็นงานของคุณ

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

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

รันสิ่งนี้ในเทอร์มินัลหนึ่งจากนั้นก่อน 60 วินาทีขึ้นไปรันในเทอร์มินัลอื่นมันจะออกจากสถานะ 1 เมื่อกระบวนการแรกออกจากคุณสามารถเรียกใช้จากเทอร์มินัลที่สอง ...

แก้ไข:

เมื่อฉันเพิ่งเรียนรู้เกี่ยวกับฝูงฉันคิดว่าฉันจะอัปเดตคำตอบนี้ ฝูง (1)อาจใช้งานง่ายกว่า ในกรณีนี้flock -nจะดูเหมาะสมเช่น

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

จะทำงานของคุณทุกนาที แต่จะล้มเหลวหากฝูงไม่สามารถล็อคไฟล์ได้


2
อาจจะมีคำถามโง่ ๆ แต่มีข้อดีที่จะใช้ไดเรกทอรีโดยเฉพาะมากกว่าไฟล์ปกติหรือไม่?
ร่าเริง

9
การใช้ไฟล์ปกติต้องใช้การดำเนินการหลายอย่างตรวจสอบดูว่ามีอยู่หรือไม่หากยังไม่ได้สร้าง สิ่งนี้ทำให้หน้าต่างของโอกาสสำหรับกระบวนการอื่นในการสร้างไฟล์ - ยุ่ง mkdir เป็นการดำเนินการปรมาณูที่ใช้ได้ทั้งสองอย่างและคุณจะได้รับ 'ล็อค' หรือไม่เป็นไปตามกระบวนการอื่นที่มีอยู่แล้ว
user9517

มีเหตุผล. คิดดีในไดเรกทอรีล็อคด้วย ขอบคุณ
John

2

วิธีหนึ่งคือให้สคริปต์ของคุณสร้างล็อกไฟล์เพื่อให้สามารถตรวจสอบดูว่ามีสคริปต์ที่ทำงานอยู่หรือไม่ นอกจากนี้คุณยังสามารถเพิ่มการจัดการข้อยกเว้นบางอย่างเพื่อดูว่าเครื่องมือค้นหาทำงานอยู่หรือไม่

ทางเลือกที่เกี่ยวข้องมากขึ้นคือการใช้คิวงานบางประเภทเช่น Resque และ Resque-scheduler:

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

นอกจากนี้ยังมี Qu และ Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

ใช่นั่นคือทั้งหมดที่เกี่ยวกับทับทิม แต่คุณสามารถมองหา "สิ่งต่าง ๆ เช่น resque" ในภาษาที่คุณเลือก


0

อีกวิธีในการตั้งค่าอย่างรวดเร็วก็คือให้เชลล์สคริปต์เริ่มทำงานเมื่อเครื่องเริ่มทำงาน (cron สามารถทำสิ่งนี้ด้วย ' @reboot /path/to/my/script.sh', จากนั้นรีสตาร์ท cron เพื่อเริ่มมันขึ้นมา) ด้วยสิ่งนี้

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

สคริปต์ยังคงทำงานต่อไปและคุณเพิ่งเริ่มใช้งานเพียงครั้งเดียวนั่นคือมีจำนวนเท่าใดที่สามารถทำงานพร้อมกันได้ - ไม่ยิ่งไปกว่านั้น สมาร์ทบางตัวในนั้นยังสามารถตรวจสอบว่าตัวทำดัชนีทำงานอยู่หรือไม่หากไม่ให้รีสตาร์ทหรือพยายามแก้ไข / แจ้งผู้อื่นเกี่ยวกับปัญหา


-3

แทนที่จะใช้ cron สำหรับสิ่งนี้ฉันจะสร้างงานของคุณให้มากขึ้นในฐานะบริการที่ทำงานเป็นวนรอบและหลับเป็นเวลา 60 วินาทีเป็นขั้นตอนสุดท้ายหรืออาจหลับบ่อยขึ้นสำหรับช่วงเวลาเล็ก ๆ ในจุดต่าง ๆ ในระหว่างกระบวนการเพื่อช่วยกระจายภาระ เท่ากันหมด


1
สิ่งนี้จะไม่แก้ไขปัญหาหรือไม่ได้รับการปรับปรุงจาก cron
ร่าเริง

มันจะแก้ไขปัญหาได้เพราะมีเพียงกระบวนการเดียวเท่านั้นที่เคยทำงาน มันจะก้าวเท้าเลี่ยง cron อย่างสมบูรณ์
Joel Coel

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