Jeśli chcesz zrobić to z kodem w pythonie, jest to dość standardowa metoda C, która została przeniesiona do pythona, którego używam. Działa bezbłędnie i można nawet wybrać wyjście pliku.
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)
Następnie można użyć sygnałów, aby złapać, gdy sygnał o zabiciu został wysłany do programu i ładnie się zakończyć. Przykład z 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
Mogę "zabić -9" to wszystko, co mnie interesuje, ale nie wiem, jak niezawodnie znaleźć jego PID. – BCS
@BCS: '-9' jest często ... * przesadą * (wybacz kalambur). Zobacz [kill -9] (http://speculation.org/garrick/kill-9.html). Jeśli chodzi o znajdowanie swojego PID, twój skrypt może utworzyć plik pidfile w '/ var/run' lub użyć biblioteki lib, która pozwala ci ustawić' argv [0] 'na pewną łatwo rozpoznawalną nazwę do użycia z' pkill'. –