首頁  >  文章  >  後端開發  >  python daemon守護程式實現

python daemon守護程式實現

高洛峰
高洛峰原創
2017-02-10 09:10:091523瀏覽

假如寫一段服務端程序,如果ctrl+c退出或關閉終端,那麼服務端程序就會退出,於是就想著讓這個程序成為守護進程,像httpd一樣,一直在後端運行,不會受終端影響。

守護程式英文為daemon,像httpd,mysqld,最後一個字母d其實就是表示daemon的意思。

守護程序的編寫步驟:

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

#!/usr/bin/env python
#coding=utf8
def 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 daemon守护进程实现

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

python daemon守护进程实现

更多python daemon守護進程實現相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn