ฉันจะเรียกใช้สคริปต์ Python ในพื้นหลังและเริ่มต้นใหม่หลังจากเกิดความผิดพลาดได้อย่างไร


10

ฉันมีสคริปต์ Python ที่ง่ายมากที่ฉันต้องการให้ทำงานบนเซิร์ฟเวอร์ Ubuntu 12.04 เสมอ ฉันคิดว่าจะใช้พุ่งพรวด + monit ปัญหาคือเครื่องมือเหล่านั้นดูค่อนข้างซับซ้อนสำหรับมนุษย์ธรรมดาอย่างฉันและฉันไม่สามารถหาตัวอย่างง่าย ๆ บนเว็บได้

พุ่งพรวด + monit เกินขนาดหรือไม่ ไม่มีใครรู้ว่าเป็นทางเลือกที่ง่ายกว่านี้หรือเป็นแบบฝึกหัดที่ดีสำหรับการพุ่งพรวด + monit? หากฉันต้องการให้แน่ใจว่าสคริปต์ทำงานอยู่ตลอดเวลาจำเป็นต้องใช้ Monit หรือไม่?


สำหรับการอ้างอิงคำถามเดียวกันถูกถามที่นี่: superuser.com/q/461546/786969
PHPirate

คำตอบ:


16

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ/etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

การเกิดใหม่จะเริ่มต้นขึ้นหากถูกฆ่าหรือออกจากศูนย์โดยไม่มีข้อยกเว้น สิ่งนี้จะกลับไปที่ Ubuntu 10.04

หากคุณมี 12.04 คุณจะได้รับแฟนซีมากขึ้น ด้านบนจะเรียกใช้สคริปต์ของคุณเป็น root ใน 12.04 คุณสามารถเพิ่ม setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

หากสคริปต์ของคุณออกเมื่อไม่มีเครือข่ายและคุณวางแผนที่จะเรียกใช้ในการเชื่อมต่อเครือข่ายที่ไม่เสถียรคุณควรแก้ไขและทำให้สคริปต์นั้นยังคงอยู่ / ลองใหม่ แต่ถ้าคุณทำไม่ได้คุณอาจต้องเริ่มต้นด้วยตนเองทุกครั้งที่มีอุปกรณ์เครือข่ายเกิดขึ้น ดังนั้นคุณสามารถวางสิ่งนี้ไว้ใน/etc/network/if-up.d/yourscript(ทำให้มันทำงานด้วย chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

โดยที่ yourcript เป็นเพียงบางสิ่งบางอย่างโดยพลการและไม่ซ้ำกับสคริปต์นี้และ "บางอย่าง" นั้นเหมือนกับชื่องาน (เช่นที่/etc/init/something.confแนะนำไว้ก่อนหน้านี้)


ใช่! ดังนั้นนี่ใช้upstartใช่มั้ย นี่หมายความว่าสคริปต์จะเริ่มต้นด้วยตอนบูท (ซึ่งจะดีมาก!) และrespawnก็เพียงพอแล้วที่คุณไม่จำเป็นต้องตั้งค่าmonit?
sebpiq

ใช่ 'start on runlevel [2345]' หมายถึงเวลาที่ระบบเข้าสู่ "โหมดผู้ใช้หลายคน" ในระยะยาวมีแผนการที่จะแทนที่ "runlevel" ที่เก่าแก่มากด้วยสิ่งต่าง ๆ เช่น 'เริ่มต้นในการเริ่มบริการเครือข่าย' และ 'หยุดการหยุดบริการเครือข่าย' เพื่อให้อ่านได้อย่างมีเหตุผลมากขึ้น
SpamapS

เยี่ยมมาก! ขอบคุณมากนั่นคือสิ่งที่ฉันต้องการ
sebpiq

2

วิธีปกติจากสมัยก่อนคือการเขียนไฟล์ที่มีการประทับเวลาหรือรหัสกระบวนการ/tmpและจากนั้นตรวจสอบว่ารหัสกระบวนการนี้ยังคงทำงานหรือเคารพถ้าการประทับเวลายังคงล่าสุด

นอกจากนี้คุณสามารถทำวิวิอย่างง่ายwhile [ 1 ]; do phyton-script.ph; doneจะรีสตาร์ทสคริปต์ในกรณีที่มันกลับมา

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


สคริปต์เพียงแค่ทวีตเรื่องที่สนใจจาก twitters โดยใช้ API การสตรีม ดังนั้นโดยทั่วไปจะมีการวนซ้ำไม่สิ้นสุดที่รอการทวีตทวีตรันโค้ดบางส่วนและกลับไปรอ ฉันแค่อยากให้เรื่องนี้ทำงานโดยไม่ต้องกังวล ... หากมีข้อผิดพลาดและมันก็ล้มเหลวและอื่น ๆ ...
sebpiq

คำตอบที่คล้ายกับของคุณ (ซึ่งฉันยอมรับ): superuser.com/questions/461546/…
sebpiq

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