欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python daemon守護(hù)進(jìn)程實現(xiàn)

 更新時間:2016年08月27日 23:51:39   投稿:mdxy-dxy  
這篇文章主要介紹了python daemon守護(hù)進(jìn)程實現(xiàn),需要的朋友可以參考下

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

守護(hù)進(jìn)程的編寫步驟:

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

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

我們來運(yùn)行一個這個程序,看看效果

從上圖可以看出這個腳本程序已經(jīng)放入后臺,只能使用killall方式來結(jié)束掉,
接下來我們?nèi)タ聪掠涗浀娜罩?/p>

相關(guān)文章

  • pycharm如何關(guān)閉pytest

    pycharm如何關(guān)閉pytest

    這篇文章主要介紹了pycharm如何關(guān)閉pytest問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python GUI庫圖形界面開發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實例

    python GUI庫圖形界面開發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • python 通過手機(jī)號識別出對應(yīng)的微信性別(實例代碼)

    python 通過手機(jī)號識別出對應(yīng)的微信性別(實例代碼)

    這篇文章主要介紹了python 通過手機(jī)號識別出對應(yīng)的微信性別,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Python爬蟲框架Scrapy簡介

    Python爬蟲框架Scrapy簡介

    這篇文章介紹了Python爬蟲框架Scrapy,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • python閉包和裝飾器你了解嗎

    python閉包和裝飾器你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Python的閉包和裝飾器,何為閉包?何為裝飾器?感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-08-08
  • Python3中對json格式數(shù)據(jù)的分析處理

    Python3中對json格式數(shù)據(jù)的分析處理

    這篇文章主要介紹了Python3中對json格式數(shù)據(jù)的分析處理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • python輸入多行的方法總結(jié)

    python輸入多行的方法總結(jié)

    Python中的Input()函數(shù)在輸入時,遇到回車符,那么一次輸入就結(jié)束了,這不能滿足輸入多行文本并且行數(shù)也不確定的情形,當(dāng)然輸入空行也是允許的,本文給大家總結(jié)了python輸入多行的方法,需要的朋友可以參考下
    2024-04-04
  • 使用OpenCV對車道進(jìn)行實時檢測的實現(xiàn)示例代碼

    使用OpenCV對車道進(jìn)行實時檢測的實現(xiàn)示例代碼

    這篇文章主要介紹了使用OpenCV對車道進(jìn)行實時檢測的實現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python轉(zhuǎn)碼問題的解決方法

    Python轉(zhuǎn)碼問題的解決方法

    在Python中,可以對String調(diào)用decode和encode方法來實現(xiàn)轉(zhuǎn)碼。
    2008-10-10
  • PyQt5通信機(jī)制 信號與槽詳解

    PyQt5通信機(jī)制 信號與槽詳解

    這篇文章主要介紹了PyQt5通信機(jī)制 信號與槽詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論