หลีกเลี่ยงไฟล์ PID, crons หรืออะไรก็ตามที่พยายามประเมินกระบวนการที่ไม่ใช่ลูกของพวกเขา
มีเหตุผลที่ดีมากที่ทำไมใน UNIX คุณสามารถรอลูก ๆ ของคุณได้เท่านั้น วิธีการใด ๆ (การแยกวิเคราะห์ ps, pgrep, การจัดเก็บ PID, ... ) ที่พยายามที่จะหลีกเลี่ยงข้อบกพร่องและมีช่องโหว่อยู่ในนั้น เพียงแค่บอกว่าไม่มี
แต่คุณต้องการกระบวนการที่ตรวจสอบกระบวนการของคุณให้เป็นกระบวนการหลัก สิ่งนี้หมายความว่า? หมายความว่าเฉพาะกระบวนการที่เริ่มกระบวนการของคุณเท่านั้นที่สามารถรอจนจบได้อย่างน่าเชื่อถือ ในทุบตีนี้เป็นเรื่องเล็กน้อยอย่างแน่นอน
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
โค้ดทุบตีส่วนบนทำงานmyserver
เป็นuntil
วนรอบ บรรทัดแรกเริ่มต้นmyserver
และรอจนจบ เมื่อมันสิ้นสุดให้until
ตรวจสอบสถานะการออก หากสถานะการออกคือ0
มันหมายความว่ามันจบลงอย่างสง่างาม (ซึ่งหมายความว่าคุณขอให้ปิดอย่างใดและมันก็ประสบความสำเร็จ) ในกรณีนั้นเราไม่ต้องการเริ่มต้นใหม่ (เราเพิ่งขอให้ปิดระบบ!) ถ้าสถานะทางออกคือไม่ 0
, until
จะทำงานร่างกายห่วงซึ่งส่งเสียงข้อความข้อผิดพลาดใน STDERR และเริ่มต้นใหม่วง (กลับไปสาย 1) หลัง 1 วินาที
เราจะรออีกทำไม เพราะหากมีบางอย่างผิดปกติกับลำดับการเริ่มต้นmyserver
และมันล้มเหลวทันทีคุณจะมีวงวนที่เข้มข้นมากในการรีสตาร์ทและหยุดอย่างต่อเนื่อง ที่sleep 1
จะไปความเครียดจากที่
ตอนนี้สิ่งที่คุณต้องทำคือเริ่มต้นสคริปต์ทุบตีนี้ (แบบอะซิงโครนัสอาจ) และมันจะตรวจสอบmyserver
และเริ่มใหม่ตามความจำเป็น หากคุณต้องการเริ่มต้นมอนิเตอร์เมื่อบู๊ตเครื่อง (ทำให้เซิร์ฟเวอร์ "รอดใหม่" ทำการรีบู๊ต) คุณสามารถกำหนดเวลาใน cron ของผู้ใช้ (1) ด้วย@reboot
กฎ เปิดกฎ cron ของคุณด้วยcrontab
:
crontab -e
จากนั้นเพิ่มกฎเพื่อเริ่มสคริปต์การตรวจสอบของคุณ:
@reboot /usr/local/bin/myservermonitor
อีกทางเลือกหนึ่ง; ดูที่ inittab (5) และ / etc / inittab คุณสามารถเพิ่มบรรทัดที่นั่นเพื่อmyserver
เริ่มต้นในระดับเริ่มต้นที่แน่นอนและจะเกิดขึ้นใหม่โดยอัตโนมัติ
แก้ไข
ให้ฉันเพิ่มข้อมูลบางอย่างเกี่ยวกับสาเหตุที่ไม่ใช้ไฟล์ PID ในขณะที่พวกเขาเป็นที่นิยมมาก พวกเขายังมีข้อบกพร่องมากและไม่มีเหตุผลว่าทำไมคุณไม่ทำตามวิธีที่ถูกต้อง
พิจารณาสิ่งนี้:
การรีไซเคิล PID (ฆ่ากระบวนการที่ไม่ถูกต้อง):
/etc/init.d/foo start
: เริ่มfoo
เขียนfoo
PID ของไปที่/var/run/foo.pid
- ในขณะที่ภายหลัง:
foo
ตายอย่างใด
- ครู่ต่อมา: กระบวนการสุ่มใด ๆ ที่เริ่มต้น (เรียกว่า
bar
) จะใช้ PID แบบสุ่มลองจินตนาการว่ามันใช้foo
PID เก่าของ
- คุณสังเกตเห็น
foo
's หายไป: /etc/init.d/foo/restart
อ่าน/var/run/foo.pid
, การตรวจสอบเพื่อดูว่ามันยังมีชีวิตอยู่พบbar
, คิดว่ามันฆ่ามันเริ่มต้นใหม่foo
foo
ไฟล์ PID ไม่เสถียร คุณต้องการที่ซับซ้อนมากกว่า (หรือฉันควรจะพูดว่าไม่น่ารำคาญ) ตรรกะในการตรวจสอบว่าไฟล์ PID จะค้างและตรรกะใด ๆ 1.
ดังกล่าวเป็นอีกความเสี่ยงที่จะ
ถ้าคุณไม่มีการเข้าถึงการเขียนหรืออยู่ในสภาพแวดล้อมแบบอ่านอย่างเดียวล่ะ?
มันเป็นเรื่องที่ไม่มีจุดหมาย ดูตัวอย่างง่ายๆของฉันด้านบน ไม่จำเป็นต้องมีความซับซ้อนเลย
ดูเพิ่มเติม: ไฟล์ PID ยังมีข้อบกพร่องเมื่อทำในสิ่งที่ 'ถูกต้อง' หรือไม่?
ยังไงซะ; ยิ่งเลวกว่าไฟล์ PID กำลังแยกps
! ไม่เคยทำเช่นนี้
ps
unportable มาก ในขณะที่คุณพบมันในเกือบทุกระบบ UNIX; อาร์กิวเมนต์จะแตกต่างกันมากหากคุณต้องการเอาต์พุตที่ไม่ได้มาตรฐาน และเอาต์พุตมาตรฐานมีไว้สำหรับการบริโภคของมนุษย์เท่านั้นไม่ใช่เพื่อการแยกวิเคราะห์แบบมีสคริปต์!
- การแยกวิเคราะห์
ps
นำไปสู่การบวกเท็จจำนวนมาก ใช้ps aux | grep PID
ตัวอย่างและตอนนี้คิดว่ามีคนที่จะเริ่มกระบวนการที่มีอยู่ที่ไหนสักแห่งจำนวนเป็นอาร์กิวเมนต์ที่เกิดขึ้นจะเป็นเช่นเดียวกับคุณ PID จ้องภูตของคุณด้วย! ลองนึกภาพคนสองคนที่เริ่มเซสชัน X และคุณต้องการให้ X ฆ่าคุณ มันเป็นเรื่องเลวร้ายทุกชนิด
หากคุณไม่ต้องการจัดการกระบวนการด้วยตนเอง มีบางระบบที่ดีอย่างสมบูรณ์ออกมีที่จะทำหน้าที่ตรวจสอบกระบวนการของคุณ ดูเป็นrunitเช่น