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


111

ฉันมีสคริปต์ Python bgservice.pyและฉันต้องการให้มันทำงานตลอดเวลาเพราะมันเป็นส่วนหนึ่งของบริการเว็บที่ฉันสร้าง ฉันจะทำให้มันทำงานอย่างต่อเนื่องแม้ว่าฉันจะออกจากระบบ SSH ได้อย่างไร

คำตอบ:


213

เรียกใช้nohup python bgservice.py &เพื่อรับสคริปต์เพื่อเพิกเฉยต่อสัญญาณ Hangup และทำงานต่อไป nohup.outเอาท์พุทจะถูกวางใน

ตามหลักการแล้วคุณจะเรียกใช้สคริปต์ของคุณด้วยสิ่งที่ต้องการsuperviseเพื่อให้สามารถเริ่มต้นใหม่ได้หาก (เมื่อ) ตาย


15
เมื่อฉันรันคำสั่งด้วย nohup และ & ฉันได้รับข้อความnohup: ignoring in put and appending output to nohup.out'` และเมื่อฉันกดเข้าสู่กระบวนการออกด้วยสถานะ 1 เกิดอะไรขึ้น?
Santosh Ghimire

1
อ่านผลลัพธ์ใน nohup.out ในกรณีของฉันมันเป็นปัญหาการอนุญาตฉันต้องใช้ sudo
mxns

และจะหยุด bgservice หลังจากรันด้วยวิธีนี้ได้อย่างไร?
ไฟในหลุม

1
@Shaegorath บันทึก pid ไว้ที่ไหนสักแห่งเพื่อให้คุณสามารถส่งสัญญาณไปยังกระบวนการในภายหลัง ในบางหอย (ทุบตี zsh ฯลฯ ) หลังจากที่คุณทำsomecommand &มันจะพิมพ์ pid [1] 12345เช่น $!มิฉะนั้นคุณสามารถใช้
Tony Beta Lambda

32

หากคุณได้เริ่มต้นกระบวนการแล้วและไม่ต้องการที่จะฆ่ามันและเริ่มต้นใหม่ภายใต้ nohup คุณสามารถส่งไปที่พื้นหลังจากนั้นปฏิเสธมัน

Ctrl+Z (ระงับกระบวนการ)

bg (เริ่มกระบวนการใหม่ในพื้นหลัง

disown %1(สมมติว่านี่คืองาน # 1 ให้ใช้jobsเพื่อกำหนด)



12

คุณอาจพิจารณาเปลี่ยนหลามสคริปต์ของคุณให้เป็นภูตหลามที่เหมาะสมตามที่อธิบายไว้ที่นี่

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

หากคุณกำลังประสบปัญหากับ python-daemon มีผู้ดูแลยูทิลิตี้รายอื่นที่จะทำเช่นเดียวกันกับคุณ แต่ในกรณีนี้คุณจะไม่ต้องเขียนโค้ดใด ๆ (หรือแก้ไขโค้ดที่มีอยู่) เนื่องจากนี่เป็นโซลูชันนอกกรอบสำหรับการแสดงผล กระบวนการ


การให้คำอธิบายสั้น ๆ เกี่ยวกับวิธีแก้ปัญหาโดยทั่วไปเป็นความคิดที่ดี
Nikhil Sahu


5

นี่คือวิธีง่ายๆใน 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.


1
บางทีอาจจำเป็นต้องจับสัญญาณ SIGHUP จากนั้นเพิ่ม signal.signal (signal.SIGHUP, handler) ในบล็อกของคุณ
Chouettou

3

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 แต่มันเป็นเชลล์ที่เจ๋งมากที่ฉันอยากจะแนะนำ


1

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

ผู้บังคับบัญชาเป็นโซลูชันนอกกรอบที่ยอดเยี่ยมที่สามารถใช้เพื่อแสดงกระบวนการใด ๆ มียูทิลิตี้ควบคุมอื่นsupervisorctlที่สามารถใช้เพื่อตรวจสอบกระบวนการที่กำลังดำเนินการโดยหัวหน้างาน

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

หลังจากเกาหัวเป็นเวลาหลายชั่วโมงรอบ ๆ python-daemon หัวหน้างานคือทางออกที่เหมาะกับฉันในไม่กี่นาที

หวังว่านี่จะช่วยคนที่พยายามทำให้ python-daemon ทำงานได้



1

ลองสิ่งนี้:

nohup python -u <your file name>.py >> <your log file>.log &

คุณสามารถเรียกใช้คำสั่งด้านบนในหน้าจอและออกมาจากหน้าจอได้

ตอนนี้คุณสามารถหางล็อกของสคริปต์ python ของคุณโดย: tail -f <your log file>.log

ในการฆ่าคุณสคริปต์คุณสามารถใช้คำสั่งps -auxและkill

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