См. Стивенс , а также эту длинную ветку на activestate , которая, как мне показалось, была в основном неверной и многословной, и я придумал следующее:
from os import fork, setsid, umask, dup2
from sys import stdin, stdout, stderr
if fork(): exit(0)
umask(0)
setsid()
if fork(): exit(0)
stdout.flush()
stderr.flush()
si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)
dup2(si.fileno(), stdin.fileno())
dup2(so.fileno(), stdout.fileno())
dup2(se.fileno(), stderr.fileno())
Если вам нужно снова остановить этот процесс, необходимо знать pid, обычное решение для этого - pidfiles. Сделайте это, если вам нужен
from os import getpid
outfile = open(pid_file, 'w')
outfile.write('%i' % getpid())
outfile.close()
По соображениям безопасности вы можете рассмотреть любой из них после демонизации
from os import setuid, setgid, chdir
from pwd import getpwnam
from grp import getgrnam
setuid(getpwnam('someuser').pw_uid)
setgid(getgrnam('somegroup').gr_gid)
chdir('/')
Вы также можете использовать nohup , но это не очень хорошо работает с модулем подпроцесса python