Nếu bạn muốn làm điều đó với mã trong python, đây là một phương pháp C khá chuẩn được chuyển đến python mà tôi sử dụng. Nó hoạt động hoàn hảo và thậm chí bạn có thể chọn đầu ra tệp.
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)
Sau đó, bạn có thể sử dụng tín hiệu để phát hiện khi tín hiệu giết được gửi đến chương trình và thoát độc đáo. Ví dụ từ 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
Tôi có thể 'giết -9' cho tất cả những gì tôi quan tâm, nhưng tôi không biết cách tìm ra PID của nó một cách đáng tin cậy như thế nào. – BCS
@BCS: '-9' thường là ... * quá mức cần thiết * (tha thứ cho trò chơi chữ). Xem [kill -9] (http://speculation.org/garrick/kill-9.html). Đối với việc tìm PID của nó, script của bạn có thể tạo một pidfile trong '/ var/run' hoặc sử dụng một lib cho phép bạn đặt' argv [0] 'thành một số tên được xác định dễ sử dụng với' pkill'. –