(我的理解有關於同一主題的SO現有的一些問題,我看了上面的答案。這些問題的答案是好的,但我仍然有一些不清楚。) 最近我碰到了一塊來到的Python在unix系統中創建守護進程:sample code 而一塊,我想談:瞭解Python代碼
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現在是一個孤兒。從父
- 解耦environment-- 我們爲什麼要這麼做?這是否意味着通過設置分叉進程1的sid,我們可以隔離分叉進程?此時分叉進程1擁有自己的進程組和會話(相當於它的pid),這意味着它是會話的領導者,這意味着有可能獲得新的控制終端。
- 叉再次和殺分叉過程1.分叉過程2現在也孤兒。它絕對不是會議的領導者(分叉過程1)。它不會與原始父進程環境共享任何內容。
- 做輸入/輸出/ ERR重定向。
所以我的理解正確有關創建守護進程的進程?還有些人所說的「這樣可以防止殭屍進程」在SO question,爲什麼這段代碼甚至與殭屍進程?父將被殺死,以便該進程受init監控,是不是「守護進程」意味着什麼?
有些人還提到一次應該給我們一個很好的守護進程。任何這樣的例子?任何一個例子(系統)在哪一次叉可能不會只是一個很好的守護進程?
[創建守護進程時執行雙叉的原因是什麼?]的可能的重複?(http://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a- double -fork-when-creating-a-daemon) –
我在我的問題中提到了這個問題,並且我已經閱讀了該問題的前3個答案。他們是很好的答案,但我仍然有一些不清楚,這已經包含在我的問題中 –
鏈接問題中的一些答案也解釋了雙重分岔只在父級進程預期壽命比孩子長時才需要從而使孩子在父母的流程表中成爲殭屍)。 – Dunes