python daemon守護進程實現(xiàn)
假如寫一段服務端程序,如果ctrl+c退出或者關(guān)閉終端,那么服務端程序就會退出,于是就想著讓這個程序成為守護進程,像httpd一樣,一直在后端運行,不會受終端影響。
守護進程英文為daemon,像httpd,mysqld,最后一個字母d其實就是表示daemon的意思。
守護進程的編寫步驟:
1、fork子進程,然后父進程退出,此時子進程會被init進程接管。
2、修改子進程的工作目錄,創(chuàng)建新進程組合新會話,修改umask。
3、子進程再次fork一個進程,這個進程可以稱為孫子進程,然后子進程退出。
4、重定向?qū)O子進程的標準輸入流,標準輸出流,標準錯誤到/dev/null
完成上面的4個步驟,那么最終的孫子進程就稱為守護進程,先看下代碼,后面分析下步驟的原因。
#!/usr/bin/env python #coding=utf8 def createDaemon(): import os, sys, time #產(chǎn)生子進程,而后父進程退出 try: pid = os.fork() if pid > 0:sys.exit(0) except OSError,error: print 'fork' sys.exit(1) #修改子進程工作目錄 os.chdir("/") #創(chuàng)建新的會話,子進程成為會話的首進程 os.setsid() #修改工作目錄的umask os.umask(0) #創(chuàng)建孫子進程,而后子進程退出 try: pid = os.fork() if pid > 0: print "Daemon PID %d"%pid sys.exit(0) except OSError,error: print "fork" sys.exit(1) run() def ping(): import os os.system('ping www.baidu.com >/dev/nul') def run(): while True: import time,threading fd = open('/home/ping.log', 'a') fd.write("start time---------:%s\n"%time.ctime()) fd.flush() t=threading.Thread(target=ping,args=()) t.start() time.sleep(3) fd.write("end of time--------:%s\n"%time.ctime()) fd.flush() fd.close() if __name__=='__main__': createDaemon()
1、fork子進程,父進程退出
通常,我們執(zhí)行服務端程序的時候都會通過終端連接到服務器,成功連接后會加載shell環(huán)境,終端盒shell都是進程,shell進程是終端進程的子進程,通過ps命令可以很容易的查看到,在這個shell環(huán)境下一開始執(zhí)行的程序都是shell進程的子進程,自然會受到shell進程的影響,在程序里fork子進程后,父進程退出,對于shell進程來說,這個父進程就算執(zhí)行完畢,而產(chǎn)生的子進程會被init進程接管,從而也就脫離了終端控制。
2.修改子進程的工作目錄
子進程在創(chuàng)建的時候會繼承父進程的工作目錄,如果執(zhí)行的程序是在U盤里面,就會導致U盤不能卸載。
3.創(chuàng)建新會話
使用setsid后,子進程就會成為新會話的首進程,子進程會成為新進程組的組長進程,子進程沒有控制終端。
4.修改umask
由于umask會屏蔽權(quán)限,所有設(shè)定為0,這樣可以避免讀寫文件時碰到權(quán)限問題
5.fork孫子進程,子進程退出
經(jīng)過上面幾個步驟后,子進程會成為新的進程組老大,可以重新申請打開終端,為了避免這個問題,fork孫子進程處理,
6.重定向?qū)O子進程的標準輸入流,標準輸出流,標準錯誤流到/dev/null
因為是守護進程,本身已經(jīng)脫離了終端,那么標準輸入流,標準輸入流,標準錯誤流就沒有什么意義了,所以都轉(zhuǎn)向到/dev/null,就是丟棄的意思
我們來運行一個這個程序,看看效果
從上圖可以看出這個腳本程序已經(jīng)放入后臺,只能使用killall方式來結(jié)束掉,
接下來我們?nèi)タ聪掠涗浀娜罩?/p>
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5打印控件QPrinter詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5打印控件QPrinter詳細使用方法與實例,需要的朋友可以參考下2020-02-02Python3中對json格式數(shù)據(jù)的分析處理
這篇文章主要介紹了Python3中對json格式數(shù)據(jù)的分析處理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01使用OpenCV對車道進行實時檢測的實現(xiàn)示例代碼
這篇文章主要介紹了使用OpenCV對車道進行實時檢測的實現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06