python daemon守護進程實現

來源:互聯網
上載者:User
假如寫一段服務端程式,如果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.修改子進程的工作目錄
子進程在建立的時候會繼承父進程的工作目錄,如果執行的程式是在隨身碟裡面,就會導致隨身碟不能卸載。
3.建立新會話
使用setsid後,子進程就會成為新會話的首進程,子進程會成為新進程組的組長進程,子進程沒有控制終端。
4.修改umask
由於umask會屏蔽許可權,所有設定為0,這樣可以避免讀寫檔案時碰到許可權問題
5.fork孫子進程,子進程退出
經過上面幾個步驟後,子進程會成為新的進程組老大,可以重新申請開啟終端,為了避免這個問題,fork孫子進程處理,
6.重新導向孫子進程的標準輸入資料流,標準輸出資料流,標準錯誤流到/dev/null
因為是守護進程,本身已經脫離了終端,那麼標準輸入資料流,標準輸入資料流,標準錯誤流就沒有什麼意義了,所以都轉向到/dev/null,就是丟棄的意思

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

從可以看出這個指令碼程式已經放入後台,只能使用killall方式來結束掉,
接下來我們去看下記錄的日誌

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.