ฉันมีสคริปต์ Python bgservice.py
และฉันต้องการให้มันทำงานตลอดเวลาเพราะมันเป็นส่วนหนึ่งของบริการเว็บที่ฉันสร้าง ฉันจะทำให้มันทำงานอย่างต่อเนื่องแม้ว่าฉันจะออกจากระบบ SSH ได้อย่างไร
ฉันมีสคริปต์ Python bgservice.py
และฉันต้องการให้มันทำงานตลอดเวลาเพราะมันเป็นส่วนหนึ่งของบริการเว็บที่ฉันสร้าง ฉันจะทำให้มันทำงานอย่างต่อเนื่องแม้ว่าฉันจะออกจากระบบ SSH ได้อย่างไร
คำตอบ:
เรียกใช้nohup python bgservice.py &
เพื่อรับสคริปต์เพื่อเพิกเฉยต่อสัญญาณ Hangup และทำงานต่อไป nohup.out
เอาท์พุทจะถูกวางใน
ตามหลักการแล้วคุณจะเรียกใช้สคริปต์ของคุณด้วยสิ่งที่ต้องการsupervise
เพื่อให้สามารถเริ่มต้นใหม่ได้หาก (เมื่อ) ตาย
somecommand &
มันจะพิมพ์ pid [1] 12345
เช่น $!
มิฉะนั้นคุณสามารถใช้
หากคุณได้เริ่มต้นกระบวนการแล้วและไม่ต้องการที่จะฆ่ามันและเริ่มต้นใหม่ภายใต้ nohup คุณสามารถส่งไปที่พื้นหลังจากนั้นปฏิเสธมัน
Ctrl+Z
(ระงับกระบวนการ)
bg
(เริ่มกระบวนการใหม่ในพื้นหลัง
disown %1
(สมมติว่านี่คืองาน # 1 ให้ใช้jobs
เพื่อกำหนด)
คุณยังสามารถใช้หน้าจอ GNUซึ่งทุกระบบ Linux / Unix ควรมี
หากคุณใช้ Ubuntu / Debian ตัวแปรbyobu ที่ปรับปรุงแล้วก็ค่อนข้างดีเช่นกัน
คุณอาจพิจารณาเปลี่ยนหลามสคริปต์ของคุณให้เป็นภูตหลามที่เหมาะสมตามที่อธิบายไว้ที่นี่
python-daemonเป็นเครื่องมือที่ดีที่สามารถใช้เพื่อรันสคริปต์ python เป็นกระบวนการ daemon พื้นหลังแทนที่จะเป็นสคริปต์ที่รันตลอดไป คุณจะต้องแก้ไขโค้ดที่มีอยู่เล็กน้อย แต่ธรรมดาและเรียบง่าย
หากคุณกำลังประสบปัญหากับ python-daemon มีผู้ดูแลยูทิลิตี้รายอื่นที่จะทำเช่นเดียวกันกับคุณ แต่ในกรณีนี้คุณจะไม่ต้องเขียนโค้ดใด ๆ (หรือแก้ไขโค้ดที่มีอยู่) เนื่องจากนี่เป็นโซลูชันนอกกรอบสำหรับการแสดงผล กระบวนการ
คุณสามารถ nohup ได้ แต่ฉันชอบหน้าจอมากกว่า
นี่คือวิธีง่ายๆใน python โดยใช้มัณฑนากร:
import os, time
def daemon(func):
def wrapper(*args, **kwargs):
if os.fork(): return
func(*args, **kwargs)
os._exit(os.EX_OK)
return wrapper
@daemon
def my_func(count=10):
for i in range(0,count):
print('parent pid: %d' % os.getppid())
time.sleep(1)
my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own
แน่นอนคุณสามารถแทนที่เนื้อหาของbgservice.py
ไฟล์แทนไฟล์my_func
.
zshเปลือกมีตัวเลือกที่จะทำให้กระบวนการพื้นหลังทั้งหมดทำงานกับ nohup
ในการ~/.zshrc
เพิ่มบรรทัด:
setopt nocheckjobs #don't warn about bg processes on exit
setopt nohup #don't kill bg processes on exit
จากนั้นคุณต้องเรียกใช้กระบวนการดังนี้: python bgservice.py &
และคุณไม่จำเป็นต้องใช้คำสั่ง nohup อีกต่อไป
ฉันรู้ว่ามีคนไม่มากที่ใช้ zsh แต่มันเป็นเชลล์ที่เจ๋งมากที่ฉันอยากจะแนะนำ
หากสิ่งที่คุณต้องการคือกระบวนการควรรันตลอดไปไม่ว่าคุณจะล็อกอินหรือไม่ก็ตามให้พิจารณารันโปรเซสเป็นดีมอน
ผู้บังคับบัญชาเป็นโซลูชันนอกกรอบที่ยอดเยี่ยมที่สามารถใช้เพื่อแสดงกระบวนการใด ๆ มียูทิลิตี้ควบคุมอื่นsupervisorctl
ที่สามารถใช้เพื่อตรวจสอบกระบวนการที่กำลังดำเนินการโดยหัวหน้างาน
คุณไม่จำเป็นต้องเขียนโค้ดเพิ่มเติมหรือแก้ไขสคริปต์ที่มีอยู่เพื่อให้ทำงานได้ ยิ่งไปกว่านั้นเอกสารประกอบแบบละเอียดทำให้กระบวนการนี้ง่ายขึ้นมาก
หลังจากเกาหัวเป็นเวลาหลายชั่วโมงรอบ ๆ python-daemon หัวหน้างานคือทางออกที่เหมาะกับฉันในไม่กี่นาที
หวังว่านี่จะช่วยคนที่พยายามทำให้ python-daemon ทำงานได้
คุณยังสามารถใช้Yapdi :
การใช้งานพื้นฐาน:
import yapdi daemon = yapdi.Daemon() retcode = daemon.daemonize() # This would run in daemon mode; output is not visible if retcode == yapdi.OPERATION_SUCCESSFUL: print('Hello Daemon')
ลองสิ่งนี้:
nohup python -u <your file name>.py >> <your log file>.log &
คุณสามารถเรียกใช้คำสั่งด้านบนในหน้าจอและออกมาจากหน้าจอได้
ตอนนี้คุณสามารถหางล็อกของสคริปต์ python ของคุณโดย: tail -f <your log file>.log
ในการฆ่าคุณสคริปต์คุณสามารถใช้คำสั่งps -auxและkill
nohup: ignoring in put and appending output to
nohup.out'` และเมื่อฉันกดเข้าสู่กระบวนการออกด้วยสถานะ 1 เกิดอะไรขึ้น?