国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python daemon守護進程實現

2020-01-04 17:25:22
字體:
來源:轉載
供稿:網友

假如寫一段服務端程序,如果ctrl+c退出或者關閉終端,那么服務端程序就會退出,于是就想著讓這個程序成為守護進程,像httpd一樣,一直在后端運行,不會受終端影響。
守護進程英文為daemon,像httpd,mysqld,最后一個字母d其實就是表示daemon的意思。

守護進程的編寫步驟:

1、fork子進程,然后父進程退出,此時子進程會被init進程接管。
2、修改子進程的工作目錄,創建新進程組合新會話,修改umask。
3、子進程再次fork一個進程,這個進程可以稱為孫子進程,然后子進程退出。
4、重定向孫子進程的標準輸入流,標準輸出流,標準錯誤到/dev/null
完成上面的4個步驟,那么最終的孫子進程就稱為守護進程,先看下代碼,后面分析下步驟的原因。

#!/usr/bin/env python#coding=utf8def createDaemon():  import os, sys, time  #產生子進程,而后父進程退出  try:    pid = os.fork()    if pid > 0:sys.exit(0)  except OSError,error:    print 'fork'    sys.exit(1)   #修改子進程工作目錄  os.chdir("/")  #創建新的會話,子進程成為會話的首進程  os.setsid()  #修改工作目錄的umask  os.umask(0)   #創建孫子進程,而后子進程退出  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子進程,父進程退出
通常,我們執行服務端程序的時候都會通過終端連接到服務器,成功連接后會加載shell環境,終端盒shell都是進程,shell進程是終端進程的子進程,通過ps命令可以很容易的查看到,在這個shell環境下一開始執行的程序都是shell進程的子進程,自然會受到shell進程的影響,在程序里fork子進程后,父進程退出,對于shell進程來說,這個父進程就算執行完畢,而產生的子進程會被init進程接管,從而也就脫離了終端控制。
2.修改子進程的工作目錄
子進程在創建的時候會繼承父進程的工作目錄,如果執行的程序是在U盤里面,就會導致U盤不能卸載。
3.創建新會話
使用setsid后,子進程就會成為新會話的首進程,子進程會成為新進程組的組長進程,子進程沒有控制終端。
4.修改umask
由于umask會屏蔽權限,所有設定為0,這樣可以避免讀寫文件時碰到權限問題
5.fork孫子進程,子進程退出
經過上面幾個步驟后,子進程會成為新的進程組老大,可以重新申請打開終端,為了避免這個問題,fork孫子進程處理,
6.重定向孫子進程的標準輸入流,標準輸出流,標準錯誤流到/dev/null
因為是守護進程,本身已經脫離了終端,那么標準輸入流,標準輸入流,標準錯誤流就沒有什么意義了,所以都轉向到/dev/null,就是丟棄的意思

我們來運行一個這個程序,看看效果

python,守護進程

從上圖可以看出這個腳本程序已經放入后臺,只能使用killall方式來結束掉,
接下來我們去看下記錄的日志

python,守護進程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陇西县| 乐昌市| 徐水县| 漳浦县| 舞钢市| 万盛区| 泽普县| 老河口市| 太白县| 淄博市| 左权县| 开封县| 忻州市| 武宁县| 韶关市| 都昌县| 巨鹿县| 九台市| 广饶县| 石景山区| 涿鹿县| 定远县| 桦南县| 冀州市| 雷州市| 河西区| 巨野县| 石林| 三门峡市| 中阳县| 老河口市| 阆中市| 赤城县| 泾川县| 循化| 麻江县| 景宁| 泗洪县| 湖州市| 同德县| 海门市|