Bunun python dilinde yazılmış bir tür artalanı çalıştırdığını varsayarak, bu geçerli olmayabilir.
Muhtemelen standart unix çift çatal ve yönlendirme dosya tanıtıcıları bir şey yapmak isteyeceksiniz. Kullandığım bu (url'si şu anda bana karşı olan bir ActiveState kod resminden uyarlanmıştır).
def daemonize(stdin, stdout, stderr, pidfile):
if os.path.isfile(pidfile):
p = open(pidfile, "r")
oldpid = p.read().strip()
p.close()
if os.path.isdir("/proc/%s"%oldpid):
log.err("Server already running with pid %s"%oldpid)
sys.exit(1)
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
log.err("Fork #1 failed: (%d) %s"%(e.errno, e.strerror))
sys.exit(1)
os.chdir("/")
os.umask(0)
os.setsid()
try:
pid = os.fork()
if pid > 0:
if os.getuid() == 0:
pidfile = open(pidfile, "w+")
pidfile.write(str(pid))
pidfile.close()
sys.exit(0)
except OSError, e:
log.err("Fork #2 failed: (%d) %s"%(e.errno, e.strerror))
sys.exit(1)
try:
os.setgid(grp.getgrnam("nogroup").gr_gid)
except KeyError, e:
log.err("Failed to get GID: %s"%e)
sys.exit(1)
except OSError, e:
log.err("Failed to set GID: (%s) %s"%(e.errno, e.strerror))
sys.exit(1)
try:
os.setuid(pwd.getpwnam("oracle").pw_uid)
except KeyError, e:
log.err("Failed to get UID: %s"%e)
sys.exit(1)
except OSError, e:
log.err("Failed to set UID: (%s) %s"%(e.errno, e.strerror))
sys.exit(1)
for f in sys.stdout, sys.stderr:
f.flush()
si = open(stdin, "r")
so = open(stdout, "a+")
se = open(stderr, "a+", 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
Sadece bu işlem döngüsünü başlatmadan önce çalıştırın ve muhtemelen doğru olanı yapacağız.
Bir yan not olarak, ubuntu'daki bir komut dosyasında shebang çizgisi olarak #!/Usr/bin/env python kullanıyorum ve benim için iyi çalışıyor.
Hata ayıklama bilgisi sağlamak için bir daemon çalıştırmıyor olsanız bile, muhtemelen stdout/stderr dosyasını bir dosyaya yeniden yönlendirmek isteyeceksiniz.
init betikleri yazı değildir. –
Peter - /etc/init.d/ dizinindeki (önyükleme sırasında çalıştırılan) bir betiğe atıfta bulunuyorum; Söz konusu betik Python'da yazılmıştır (çünkü bash'a dayanamıyorum). – jldupont