- # -*-coding:utf-8-*-
- import sys, os
- '''將當前進程fork為一個守護進程
- 注意:如果你的守護進程是由inetd啟動的,不要這樣做!inetd完成了
- 所有需要做的事情,包括重定向標準文件描述符,需要做的事情只有
- chdir() 和 umask()了
- '''
- def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'):
- '''Fork當前進程為守護進程,重定向標準文件描述符
- (默認情況下定向到/dev/null)
- '''
- #Perform first fork.
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0) #first parent out
- except OSError, e:
- sys.stderr.write("fork #1 failed: (%d) %s\n" %(e.errno, e.strerror))
- sys.exit(1)
- #從母體環境脫離
- os.chdir("/")
- os.umask(0)
- os.setsid()
- #執行第二次fork
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0) #second parent out
- except OSError, e:
- sys.stderr.write("fork #2 failed: (%d) %s]n" %(e.errno,e.strerror))
- sys.exit(1)
- #進程已經是守護進程了,重定向標準文件描述符
- for f in sys.stdout, sys.stderr: f.flush()
- si = file(stdin, 'r')
- so = file(stdout,'a+')
- se = file(stderr,'a+',0)
- os.dup2(si.fileno(), sys.stdin.fileno())
- os.dup2(so.fileno(), sys.stdout.fileno())
- os.dup2(se.fileno(), sys.stderr.fileno())
- def _example_main():
- '''示例函數:每秒打印一個數字和時間戳'''
- import time
- sys.stdout.write('Daemon started with pid %d\n' % os.getpid())
- sys.stdout.write('Daemon stdout output\n')
- sys.stderr.write('Daemon stderr output\n')
- c = 0
- while True:
- sys.stdout.write('%d: %s\n' %(c, time.ctime()))
- sys.stdout.flush()
- c = c+1
- time.sleep(1)
- if __name__ == "__main__":
- daemonize()
- _example_main()
- '''
- 第一個fork是為了讓shell返回,同時讓你完成setsid(從你的控制終端移除,這樣就不會意外地收到信號)。setsid使得這個進程成為“會話領導(session leader)”,即如果這個進程打開任何終端,該終端就會成為此進程的控制終端。我們不需要一個守護進程有任何控制終端,所以我們又fork一次。在第二次fork之后,此進程不再是一個“會話領導”,這樣它就能打開任何文件(包括終端)且不會意外地再次獲得一個控制終端
- 另外說明:
- umask()函數為進程設置文件模式創建屏蔽字,并返回以前的值
- 在shell命令行輸入:umask 就可知當前文件模式創建屏蔽字
- 常見的幾種umask值是002,022和027,002阻止其他用戶寫你的文件,022阻止同組成員和其他用戶寫你的文件,027阻止同組成員寫你的文件以及其他用戶讀寫或執行你的文件
- rwx-rwx-rwx 代表是777 所有的人都具有權限讀寫與執行
- chmod()改變文件的權限位
- int dup(int filedes) 返回新文件描述符一定是當前文件描述符中的最小數值
- int dup2(int filedes, int filedes2);這兩個函數返回的新文件描述符與參數filedes共享同一個文件表項。
- '''
Python守護進程(daemon)代碼實例
2019-11-23 17:41junjie Python
這篇文章主要介紹了Python守護進程(daemon)代碼實例,本文直接給出實現代碼,代碼中包含詳細注釋,需要的朋友可以參考下
延伸 · 閱讀
- 2022-03-11用Python實現一個模仿UP主彈幕控制的直播間功能
- 2022-03-11Python實戰之設計一個多功能辦公小工具
- 2022-03-11Python數據分析之缺失值檢測與處理詳解
- 2022-03-11Python變量的作用域詳解
- 2022-03-11Python之捕捉異常詳解
- 2022-03-11Python進度條可視化之監測程序運行速度
- Python
python 獲取微信好友列表的方法(微信web)
今天小編就為大家分享一篇python 獲取微信好友列表的方法(微信web),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...
- Python
Python模擬脈沖星偽信號頻率實例代碼
這篇文章主要介紹了Python模擬脈沖星偽信號頻率實例代碼,具有一定借鑒價值,需要的朋友可以參考下...
- Python
Python裝飾器模式定義與用法分析
這篇文章主要介紹了Python裝飾器模式定義與用法,結合實例形式分析了Python裝飾器模式的具體定義、使用方法及相關操作技巧,需要的朋友可以參考下...
- Python
Python實現的批量修改文件后綴名操作示例
這篇文章主要介紹了Python實現的批量修改文件后綴名操作,涉及Python目錄文件的遍歷、重命名等相關操作技巧,需要的朋友可以參考下...
- Python
tensorflow: variable的值與variable.read_value()的值區別詳解
今天小編就為大家分享一篇tensorflow: variable的值與variable.read_value()的值區別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...
- Python
python連接mysql數據庫并讀取數據的實現
這篇文章主要介紹了python連接mysql數據庫并讀取數據的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...
- Python
python實現k-means聚類算法
這篇文章主要為大家詳細介紹了python實現k-means聚類算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下...
- Python
使用pygame模塊編寫貪吃蛇的實例講解
下面小編就為大家分享一篇使用pygame模塊編寫貪吃蛇的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...