Frage

Ich habe ein funktionierendes Python -basiertes Programm, das ich als Daemon ausführen möchte. Derzeit mache ich es auf sehr hackische Weise, es zu beginnen screen-d -m name Sitzung und Tötung mit pkill -9 -f name.

Irgendwann muss ich dies in das bessere System verlegen, das wir hier verwenden (also Ich bin nicht bereit, das Programm zu ändern) Aber in der Zwischenzeit suche ich einen saubereren Weg, dies zu tun.

Mein aktuelles Denken ist es als Hintergrundaufgabe aus einem Inti.D -Skript, aber wie schreibe ich den Teil, um es wieder zu runterzubringen?

War es hilfreich?

Andere Tipps

Unter Linux gibt es a Start-Stop-Daemon Nützlichkeit als Teil der Init.D -Tools.

Es ist sehr flexibel und ermöglicht verschiedene Möglichkeiten, die PID Ihres Servers zu erfassen.

Es gibt auch eine Datei /etc/init.d/Skeletton, die als Grundlage für Ihr eigenes Init.D -Skript dienen kann.

Wenn Ihre Zielplattform auf Debian basiert, ist es sinnvoll, ein Debina -Paket zu erstellen, um es bereitzustellen, da es auch hilft, einen Daemon ordnungsgemäß in den Rest des Systems zu integrieren. Und es ist nicht zu kompliziert (wenn Sie es schon zehnmal getan haben ;-)

Wenn Sie es mit Code in Python tun möchten, ist dies ein ziemlich Standard-C-Methode, der auf Python portiert wurde, den ich verwende. Es funktioniert einwandfrei und Sie können sogar eine Dateiausgabe auswählen.

import os
import signal
def daemonize(workingdir='.', umask=0,outfile='/dev/null'):
#Put in background
pid = os.fork()
if pid == 0:
    #First child
    os.setsid()
    pid = os.fork() #fork again
    if pid == 0:
        os.chdir(workingdir)
        os.umask(umask)
    else:
        os._exit(0)
else:
    os._exit(0)

#Close all open resources
try:
    os.close(0)
    os.close(1)
    os.close(2)
except:
    raise Exception("Unable to close standard output. Try running with 'nodaemon'")
    os._exit(1)

#Redirect output
os.open(outfile, os.O_RDWR | os.O_CREAT)
os.dup2(0,1)
os.dup2(0,2)

Dann können Sie Signale verwenden, um zu fangen, wenn ein Kill-Signal an das Programm gesendet wurde und gut beendet. Beispiel von Python Docs

import signal, os

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    raise IOError("Couldn't open device!")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm

Es gibt Module, die verwendet werden könnten, um ein Python -Skript zu besaemisieren.

Python-daemon Implementiert die gut erzogene Daemon-Spezifikation (PEP 3143).

Ebenfalls Dieses Modul Kürzlich wurde Github aufgetaucht, das pythonischer und einfacher zu verwenden scheint.

Beginnen Sie es mit einem init.d Style -Skript ist ein guter Weg. Sie nehmen es mit POSIX -Signalen ab ... siehe Stackoverflow, Signalhandling in Python.

Versuche dies Frage oder mehr genau akzeptierte Lösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top