คุณจะสร้าง daemon ใน Python ได้อย่างไร


244

การค้นหาใน Googleพบว่ามีโค้ดขนาด x2 ผลลัพธ์แรกคือสูตรรหัสนี้ซึ่งมีเอกสารและคำอธิบายมากมายพร้อมกับการสนทนาที่มีประโยชน์ภายใต้

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

ตัวอย่างทั้งสองอธิบายวิธีสร้าง daemon มีสิ่งใดเพิ่มเติมที่ต้องพิจารณาอีกหรือไม่ ตัวอย่างหนึ่งดีกว่าอีกตัวอย่างหนึ่งและเพราะอะไร


1
ฉันพบรหัส daemonization ที่ไม่จำเป็นเสมอ ทำไมไม่ปล่อยให้เปลือกทำ
emil.p.stanchev

17
เพราะมันไม่ได้ทำ setsid หรือ setpgrp
bmargulies

4
ใช้supervisord.org วิธีนี้คุณไม่จำเป็นต้องแยก () หรือเปลี่ยนเส้นทางคุณ stdin / stderr เพียงแค่เขียนโปรแกรมปกติ
guettli

คำตอบ:


169

ทางออกปัจจุบัน

การดำเนินการอ้างอิงของPEP 3143 (Standard ห้องสมุดกระบวนการภูต)ขณะนี้ใช้ได้เป็นหลามภูต

คำตอบในอดีต

ตัวอย่างโค้ดของ Sander Marechal นั้นยอดเยี่ยมกว่าต้นฉบับซึ่งโพสต์ครั้งแรกในปี 2004 ฉันเคยสนับสนุน daemonizer ให้กับ Pyro แต่อาจจะใช้รหัสของ Sander ถ้าฉันต้องทำมากกว่า


72
แก้ไข: ตั้งแต่แรกที่ฉันโพสต์คำตอบนี้การอ้างอิงการใช้งาน PEP 3143 มีให้ในตอนนี้: pypi.python.org/pypi/python-daemon
Jeff Bauer

@JeffBauer ลิงก์เดิมเสียชีวิตฉันจำได้ว่ามันมีประโยชน์คุณจะไม่ได้รู้ว่าลิงค์สดสำหรับสิ่งที่คุณต้องการหรือไม่
CrazyCasta

1
@CrazyCasta: เวอร์ชันของ Sander Marechal ยังคงมีอยู่ในWayback Machine
Jeff Bauer

1
@JeffBauer: http://pypi.python.org/pypi/python-daemonรหัสซานเดอร์ก็ยังดีกว่า น่าเชื่อถือยิ่งกว่า. เพียงตัวอย่างเดียว: พยายามเริ่ม ดีมอนสองครั้งด้วยpython-daemon: ข้อผิดพลาดที่น่าเกลียดมาก ด้วยรหัสของ Sander: สังเกตได้ดี "Daemon ทำงานอยู่แล้ว"
Basj

2
เนื่องจากเอกสารประกอบโมดูล "python-daemon" ยังคงหายไป (ดูคำถาม SO อื่น ๆ อีกมากมาย) และค่อนข้างคลุมเครือ (วิธีเริ่ม / หยุดอย่างถูกต้อง daemon จากบรรทัดคำสั่งด้วยโมดูลนี้) ฉันแก้ไขตัวอย่างโค้ดของ Sander Marechal เพื่อเพิ่มquit()วิธีการที่ได้รับการดำเนินการก่อนที่ daemon จะหยุด นี่มันคือ
Basj

163

มีหลายสิ่งที่น่างงแงที่ต้องดูแลเมื่อเป็นกระบวนการดีมอนที่มีมารยาท :

  • ป้องกันการถ่ายโอนข้อมูลหลัก (daemons จำนวนมากที่ทำงานในฐานะ root และการถ่ายโอนข้อมูลหลักอาจมีข้อมูลที่ละเอียดอ่อน)

  • ประพฤติอย่างถูกต้องภายในchrootคุก

  • ตั้งค่า UID, GID, ไดเร็กทอรีการทำงาน, umask และพารามิเตอร์กระบวนการอื่น ๆ อย่างเหมาะสมสำหรับกรณีการใช้งาน

  • สละสูงsuid, sgidสิทธิพิเศษ

  • ปิดตัวอธิบายไฟล์ที่เปิดทั้งหมดโดยมีการยกเว้นขึ้นอยู่กับกรณีการใช้งาน

  • ประพฤติอย่างถูกต้องถ้าเริ่มต้นภายในบริบทแล้วแฝดเช่นinit, inetdฯลฯ

  • ตั้งค่าตัวจัดการสัญญาณสำหรับการทำงานที่เหมาะสม daemon แต่ยังมีตัวจัดการเฉพาะที่กำหนดโดยกรณีการใช้งาน

  • เปลี่ยนเส้นทางลำธารมาตรฐานstdin, stdout, stderrตั้งแต่กระบวนการภูตไม่ได้มีสถานีควบคุม

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

  • อนุญาตการล้างที่เหมาะสมเมื่อกระบวนการถูกยกเลิก

  • อันที่จริงกลายเป็นกระบวนการภูตโดยไม่นำไปสู่ซอมบี้

บางส่วนเป็นมาตรฐานตามที่อธิบายไว้ในวรรณกรรม Unix ซึ่งเป็นที่ยอมรับ ( การเขียนโปรแกรมขั้นสูงใน UNIX Environmentโดย W. W. Richard Stevens, Addison-Wesley, 1992) อื่น ๆ เช่นการเปลี่ยนเส้นทางสตรีมและการจัดการไฟล์ PIDเป็นพฤติกรรมปกติที่ผู้ใช้ daemon ส่วนใหญ่คาดหวัง แต่จะมีมาตรฐานน้อยกว่า

ทั้งหมดเหล่านี้ได้รับความคุ้มครองโดยPEP 3143 “มาตรฐานกระบวนการภูตห้องสมุด” สเปค หลามภูตดำเนินการอ้างอิงทำงานบน Python 2.7 หรือในภายหลังและ Python 3.2 หรือในภายหลัง


26
“ gaol” สะกดถูกต้องเพราะนั่นคือวิธีที่ W. Richard Stevens สะกด :-)
bignose

7
เรือนจำเป็นสิ่งที่ภาษาอังกฤษ โปสเตอร์มาจากออสเตรเลียดังนั้นจึงสมเหตุสมผล
devin

1
มีแผนที่จะสร้างเวอร์ชั่นที่เป็นมิตรกับ py3k หรือไม่?
Tim Tisdall

97

ต่อไปนี้เป็น Python 'Howdy World' พื้นฐานของฉันที่ฉันเริ่มต้นด้วยเมื่อฉันพัฒนาแอปพลิเคชัน daemon ใหม่

#!/usr/bin/python
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/foo.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            print("Howdy!  Gig'em!  Whoop!")
            time.sleep(10)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

โปรดทราบว่าคุณจะต้องมีpython-daemonห้องสมุด คุณสามารถติดตั้งได้โดย:

pip install python-daemon

จากนั้นเพียงแค่เริ่มต้นด้วยและหยุดมันด้วย./howdy.py start./howdy.py stop


5
ที่daemonโมดูลที่คุณนำเข้าไม่ได้เป็นส่วนหนึ่งของมาตรฐานของงูใหญ่ (ยัง) จำเป็นต้องติดตั้งพร้อมpip install python-daemonหรือเทียบเท่า
เนท

6
ฉันติดตั้ง python-daemon ตามที่คุณอธิบาย แต่เมื่อฉันพยายามเรียกใช้แอพของฉัน (เหมือนกับ 3 บรรทัดสุดท้าย) ฉันจะได้รับ ImportError: ไม่สามารถนำเข้าชื่อนักวิ่งได้
Nostradamnit

คุณสามารถตรวจสอบว่าติดตั้งถูกต้องหรือไม่ $ dpkg -L python-daemon | grep runner /usr/share/pyshared/daemon/runner.py
Dustin Kirkland

4
คำแนะนำนี้ดูเหมือนจะล้าสมัย - ณ เดือนกันยายน 2556 อย่างไรก็ตามpython.org/dev/peps/pep-3143ไม่ได้กล่าวถึง "นักวิ่ง" ที่สามารถนำเข้าได้ หลักสูตรนี้จะอธิบายการสังเกตของ @Nostradamnit
offby1

2
สิ่งนี้ยังใช้งานได้ดีสำหรับฉันในเดือนกันยายน 2013 บน Ubuntu 13.04 พร้อมแพ็คเกจ Python แบบสต็อก, python2.7 และ python-daemon ติดตั้งอยู่ ด้วย python3 ฉันเห็นข้อผิดพลาด "จาก daemon import runner ImportError: ไม่มีโมดูลชื่อ 'daemon'"
Dustin Kirkland

42

สังเกตแพ็คเกจpython-daemonซึ่งแก้ปัญหาเบื้องหลัง daemons ได้มากมาย

คุณสมบัติอื่น ๆ ที่ช่วยให้สามารถ (จากคำอธิบายแพ็คเกจ Debian):

  • แยกกระบวนการออกเป็นกลุ่มกระบวนการของตัวเอง
  • ตั้งค่าสภาพแวดล้อมของกระบวนการที่เหมาะสมสำหรับการทำงานภายใน chroot
  • ยกเลิกสิทธิ์ suid และ sgid
  • ปิดตัวอธิบายไฟล์ที่เปิดทั้งหมด
  • เปลี่ยนไดเร็กทอรีการทำงาน uid, gid และ umask
  • ตั้งค่าเครื่องจัดการสัญญาณที่เหมาะสม
  • เปิดตัวให้คำอธิบายไฟล์ใหม่สำหรับ stdin, stdout และ stderr
  • จัดการไฟล์ล็อค PID ที่ระบุ
  • ลงทะเบียนฟังก์ชันการล้างข้อมูลสำหรับการประมวลผลที่ออก

35

ทางเลือก - สร้างปกติโปรแกรมที่ไม่ใช่ของ daemonized หลามแล้วภายนอก daemonize โดยใช้supervisord สิ่งนี้สามารถบันทึกอาการปวดหัวได้จำนวนมากและเป็น * ระวัง - และพกพาภาษา


1
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุด โดยเฉพาะอย่างยิ่งถ้าคุณต้องการเรียกใช้หลาย daemons บนระบบปฏิบัติการเดียว อย่าใช้รหัสนำมาใช้ซ้ำ
guettli

มันช่วยลดปัญหามากมาย ฉันเขียนภูตจริงแล้ว - มันไม่ง่ายเลย
Chris Johnson

1
คำตอบที่ดีที่สุดจะถูกซ่อนไว้ที่นี่ :)
kawing-Chiu

1
นี่คือทองคำ หลังจากใช้เวลาหลายชั่วโมงในการพยายามใช้ python-daemon นี่เป็นทางออกที่ไม่เหมาะกับฉัน เอกสารและตัวอย่างที่ยอดเยี่ยมทำให้ภูตของฉันทำงานในไม่กี่นาที
Nikhil Sahu

17

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

[Unit]
Description=Python daemon
After=syslog.target
After=network.target

[Service]
Type=simple
User=<run as user>
Group=<run as group group>
ExecStart=/usr/bin/python <python script home>/script.py

# Give the script some time to startup
TimeoutSec=300

[Install]
WantedBy=multi-user.target

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

-Orby


นี่คือวิธีที่เหมาะสมและมีเหตุผล 1) ต้องมีการบันทึกใน /etc/systemd/system/control.service 2) sudo ที่จัดการแล้วsystemctl start control.service
jimper

7

YapDiเป็นโมดูลหลามที่ค่อนข้างใหม่ที่โผล่ขึ้นมาใน Hacker News ดูมีประโยชน์พอสมควรสามารถใช้ในการแปลงสคริปต์ python เป็นโหมด daemon จากภายในสคริปต์


6

เนื่องจาก python-daemon ยังไม่รองรับ python 3.x และจากสิ่งที่สามารถอ่านได้ในรายชื่อผู้รับจดหมายฉันอาจไม่เคยเขียนฉันได้ใช้งาน PEP 3143 ใหม่: pep3143daemon

pep3143daemon ควรสนับสนุนอย่างน้อย python 2.6, 2.7 และ 3.x

นอกจากนี้ยังมีคลาส PidFile

ไลบรารีขึ้นอยู่กับไลบรารีมาตรฐานและโมดูลหกโมดูลเท่านั้น

มันสามารถใช้เป็นแบบหล่นแทน python-daemon

นี่คือเอกสาร


6

ฟังก์ชันนี้จะแปลงแอปพลิเคชันเป็น daemon:

import sys
import os

def daemonize():
    try:
        pid = os.fork()
        if pid > 0:
            # exit first parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #1 failed: {0}\n'.format(err))
        sys.exit(1)
    # decouple from parent environment
    os.chdir('/')
    os.setsid()
    os.umask(0)
    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #2 failed: {0}\n'.format(err))
        sys.exit(1)
    # redirect standard file descriptors
    sys.stdout.flush()
    sys.stderr.flush()
    si = open(os.devnull, 'r')
    so = open(os.devnull, 'w')
    se = open(os.devnull, 'w')
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

5

ฉันกลัวว่าโมดูล daemon ที่ @Dustin พูดถึงไม่ทำงานสำหรับฉัน ฉันติดตั้งpython-daemon แทนและใช้รหัสต่อไปนี้:

# filename myDaemon.py
import sys
import daemon
sys.path.append('/home/ubuntu/samplemodule') # till __init__.py
from samplemodule import moduleclass 

with daemon.DaemonContext():
    moduleclass.do_running() # I have do_running() function and whatever I was doing in __main__() in module.py I copied in it.

วิ่งได้ง่าย

> python myDaemon.py

เพื่อความสมบูรณ์ที่นี่คือเนื้อหาไดเรกทอรี samplemodule

>ls samplemodule
__init__.py __init__.pyc moduleclass.py

เนื้อหาของ moduleclass.py สามารถ

class moduleclass():
    ...

def do_running():
    m = moduleclass()
    # do whatever daemon is required to do.

2

อีกสิ่งหนึ่งที่ควรคำนึงถึงเมื่อ daemonizing ใน python:

หากคุณกำลังใช้การบันทึกแบบหลามและคุณต้องการใช้งานต่อไปหลังจาก daemonizing ตรวจสอบให้แน่ใจว่าได้เรียกclose()ใช้ตัวจัดการ (โดยเฉพาะตัวจัดการไฟล์)

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

สิ่งนี้จะถือว่าเมื่อคุณ daemonise คุณกำลังปิดตัวอธิบายไฟล์ที่เปิดทั้งหมดโดยไม่เลือก - คุณสามารถลองปิดทั้งหมดยกเว้นไฟล์บันทึก (แต่โดยปกติจะง่ายกว่าที่จะปิดทั้งหมดแล้วเปิดใหม่ที่คุณต้องการ)


คุณคิดว่าการเปิดตัวจัดการการบันทึกใหม่ดีกว่าการส่งตัวจัดการการบันทึกผ่านไปยัง daemon โดยใช้ตัวเลือก files_preserve ของ DaemonContext หรือไม่?
HeyWatchThis

คุณกำลังปิดตัวบันทึกเท่านั้นคุณไม่ได้สร้างใหม่ (มันจะเพิ่งเปิดใหม่เมื่อมันต้องการ) แต่ถึงแม้ว่าจะเป็นเรื่องง่ายที่จะทำเช่นนั้นมันอาจจะดีกว่าที่จะใช้ DaemonContext เพราะมันอาจทำสิ่งที่ฉลาดอื่น ๆ (สมมติว่าการรักษายังคงอนุญาตให้ใช้การจัดการที่เหมาะสม)
Matthew Wilcoxson

2

แม้ว่าคุณอาจต้องการโซลูชัน Python แท้ที่จัดทำโดยโมดูล python-daemon แต่ก็มีdaemon(3)ฟังก์ชั่นในlibcอย่างน้อยบนBSDและLinuxซึ่งจะทำสิ่งที่ถูกต้อง

การโทรจากไพ ธ อนนั้นง่าย:

import ctypes

ctypes.CDLL(None).daemon(0, 0) # Read the man-page for the arguments' meanings

สิ่งที่ต้องทำเพียงอย่างเดียวคือการสร้าง (และการล็อก) ของไฟล์ PID แต่คุณสามารถจัดการกับตัวเอง ...


1

ฉันแก้ไขสองสามบรรทัดในตัวอย่างโค้ดของ Sander Marechal (พูดถึงโดย @JeffBauer ในคำตอบที่ยอมรับ ) เพื่อเพิ่มquit()วิธีการที่จะดำเนินการก่อนที่ daemon จะหยุดทำงาน บางครั้งมันมีประโยชน์มาก

นี่มันคือ

หมายเหตุ: ฉันไม่ได้ใช้โมดูล "python-daemon" เนื่องจากเอกสารยังคงหายไป (ดูคำถาม SO อื่น ๆ อีกมากมาย) และค่อนข้างคลุมเครือ (วิธีเริ่ม / หยุดอย่างถูกต้อง daemon จากบรรทัดคำสั่งกับโมดูลนี้)


-1

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

ตัวอย่างเช่นสำหรับ Linux แทนที่จะทำpython myapp startและpython myapp stopฉันทำสิ่งนี้เพื่อเริ่มแอพ:

screen -S myapp python myapp.py    
CTRL+A, D to detach

หรือscreen -dmS myapp python myapp.pyเพื่อเริ่มและแยกออกในคำสั่งเดียว

แล้ว:

screen -r myapp

เพื่อแนบกับเทอร์มินัลนี้อีกครั้ง เมื่ออยู่ในเทอร์มินัลคุณสามารถใช้ CTRL + C เพื่อหยุดมันได้


-2

วิธีที่ง่ายที่สุดในการสร้าง daemon ด้วย Python ก็คือการใช้งานTwisted event-driven Framework มันจัดการทุกสิ่งที่จำเป็นสำหรับการ daemonization สำหรับคุณ มันใช้รูปแบบของเครื่องปฏิกรณ์เพื่อจัดการกับคำขอที่เกิดขึ้นพร้อมกัน


5
มันใหญ่เกินกว่าค้อนที่จะใช้ คนส่วนใหญ่ต้องการเรียกใช้สคริปต์ Python สั้น ๆ ที่พวกเขาเขียนเป็น daemon python-daemon ตามที่อธิบายไว้ข้างต้นเป็นคำตอบที่ถูกต้อง
Tom Swirly

2
แม้ว่าคำตอบนี้ค่อนข้างหยิ่ง แต่ก็มีประโยชน์
fiatjaf

-28

80% ของเวลาเมื่อคนพูดว่า "daemon" พวกเขาต้องการเพียงเซิร์ฟเวอร์ เนื่องจากคำถามนั้นไม่ชัดเจนอย่างสมบูรณ์ในประเด็นนี้จึงยากที่จะบอกว่าคำตอบที่เป็นไปได้อาจเป็นอะไร เนื่องจากเซิร์ฟเวอร์มีเพียงพอให้เริ่มต้นที่นั่น หากจำเป็นต้องใช้ "daemon" จริง ๆ (นี่เป็นของหายาก) ให้อ่านข้อมูลเพิ่มเติมnohupเพื่อหาวิธีทำให้ดีมอนเซิร์ฟเวอร์

จนกว่าจะถึงเวลาดังกล่าวที่จำเป็นต้องใช้ daemon จริงเพียงแค่เขียนเซิร์ฟเวอร์อย่างง่าย

ดูที่การใช้การอ้างอิง WSGI

ดูที่Simple HTTP Serverด้วย

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


12
ไม่มีไลบรารีเหล่านั้นที่ทำเพียงfork()อย่างเดียว พวกเขาไม่มีอะไรเกี่ยวข้องกับการทำให้เป็นภูต
Brandon Rhodes

8
บนระบบปฏิบัติการ Unix กระบวนการ“ daemon” - เหมือนกับพนักงานต้อนรับทางอากาศที่ชาวกรีกเรียกว่า“ daemons” - เป็นสิ่งที่“ ยืนเคียงข้างกัน” แทนที่จะให้บริการผู้ใช้รายเดียวโดยตรงผ่าน TTY ของผู้ใช้ daemon นั้นไม่มี TTY แต่สามารถตอบรับการร้องขอจากผู้ใช้จำนวนมากบนระบบหรือ - crondหรือหรือsyslogd- ทำหน้าที่ดูแลทำความสะอาดสำหรับทั้งระบบ ในการสร้างกระบวนการ daemon อย่างน้อยหนึ่งรายการจะต้องดำเนินการอย่างน้อยสองครั้งfork()โดยที่ตัวอธิบายไฟล์ทั้งหมดถูกปิดดังนั้นจึงมีภูมิคุ้มกันต่อสัญญาณจากเทอร์มินัลการควบคุมทั้งหมดรวมถึงคอนโซลระบบ ดูคำตอบของ bignose
Brandon Rhodes

5
@S Lott -“ เซิร์ฟเวอร์” อธิบายว่ากระบวนการทำอะไร (ฟังคำขอเข้ามาแทนการเริ่มการทำงานของตัวเอง); “ daemon” อธิบายว่ากระบวนการทำงานอย่างไร (ไม่มีหน้าต่างหรือเทอร์มินัลการควบคุม) SimpleHTTPServerแน่นอนว่าเป็นเซิร์ฟเวอร์ แต่เป็นเซิร์ฟเวอร์ที่ไม่ทราบวิธีการกำหนดเอง (เช่นคุณสามารถกด Ctrl-C เป็นต้น) nohupเป็นยูทิลิตี้ในการจัดการกระบวนการไร้เดียงสาดังนั้นเซิร์ฟเวอร์ nohupped ของคุณจึงเป็นทั้ง daemon และเซิร์ฟเวอร์ตามที่คุณอ้างสิทธิ์ คำถาม Stack Overflow นี้เป็นคำถามที่ถามว่า“ ฉันจะนำไปใช้nohupใน Python ได้อย่างไร”
Brandon Rhodes

5
ใช่ แต่ความเข้าใจของฉันเกี่ยวกับคำถาม OPs คือเขาต้องการที่จะทำ daemonisation จากภายในโปรแกรมของหลามและโดยไม่ต้องใช้อย่างอื่น
Noufal Ibrahim

4
@S Lott - คุณไม่จำเป็นต้องประทับใจ! ผู้เขียนคำตอบอื่น ๆ ทุกคนรู้ว่า“ daemon” มีความหมายอย่างไรดังนั้นความสามารถของฉันในการตีความคำถามนี้จึงไม่เหมือนใคร :) และคุณได้รับความคิดที่ว่าฉันต้องการให้ผู้แต่งคิดค้นล้อใหม่ขึ้นมาได้ที่ไหน ฉันคิดว่าnohupเป็นเครื่องมือที่ดีและฉันจะลบ -1 โหวตของฉันถ้าคุณเพียงแค่ย้ายความคิดที่มีประโยชน์นั้นไปสู่คำตอบที่แท้จริงของคุณ ในความเป็นจริงถ้าคุณพูดถึงsupervisordและวิธีการที่จะช่วยให้ผู้เขียนจากการบันทึก, สคริปต์เริ่มต้นและการควบคุมปริมาณการเริ่มต้นใหม่แล้วฉันจะ +1 คุณ :)
Brandon Rhodes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.