(Я понимаю, что есть некоторые существующие вопросы по SO по той же теме, и я прочитал самые популярные ответы. Эти ответы хороши, но у меня все еще есть что-то неясное.) Недавно я наткнулся на кусок Python для создания процесса демона в системе Unix: образец кода И часть, о которой я хочу поговорить:
def daemonize(self):
"""
do the UNIX double-fork magic, see Stevens' "Advanced
Programming in the UNIX Environment" for details (ISBN 0201563177)
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
"""
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
# decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
# redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
si = file(self.stdin, 'r')
so = file(self.stdout, 'a+')
se = file(self.stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# write pidfile
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile,'w+').write("%s\n" % pid)
Итак, процесс такой:
- Создать вилку текущего процесса и убить родительский процесс. Итак, в этом случае разветвленный процесс 1 теперь является сиротой.
- отделить от родительской среды - зачем мы это делаем? означает ли это, что, задав sid разветвленного процесса 1, мы можем изолировать разветвленный процесс? на этом этапе разветвленный процесс 1 имеет свою собственную группу процессов и сеанс (равный его pid), что означает, что он является лидером сеанса, что означает возможность получения нового управляющего терминала.
- снова форкнуть и убить разветвленный процесс 1. Разветвленный процесс 2 теперь тоже сирота. и это определенно не лидер сеанса (был разветвленный процесс 1). и он ничего не разделяет с исходной средой родительского процесса.
- выполнить перенаправление ввода / вывода / ошибки.
Итак, правильно ли я понимаю процесс создания процесса-демона? Также некоторые люди упомянули, что «это может предотвратить процессы зомби» в ИТОГО вопрос, почему этот фрагмент кода вообще связан с процессом зомби? Родитель будет убит, чтобы процесс контролировался init, не что означает "демон"?
Некоторые люди также упоминают, что однократное разветвление уже должно дать нам хороший процесс демона. Любой пример для этого? Любой пример (система), при котором вилка однажды может не работать просто как хороший демон?