Python守護(hù)進(jìn)程(daemon)代碼實(shí)例
# -*-coding:utf-8-*-
import sys, os
'''將當(dāng)前進(jìn)程fork為一個(gè)守護(hù)進(jìn)程
注意:如果你的守護(hù)進(jìn)程是由inetd啟動(dòng)的,不要這樣做!inetd完成了
所有需要做的事情,包括重定向標(biāo)準(zhǔn)文件描述符,需要做的事情只有
chdir() 和 umask()了
'''
def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'):
'''Fork當(dāng)前進(jìn)程為守護(hù)進(jìn)程,重定向標(biāo)準(zhǔn)文件描述符
(默認(rèn)情況下定向到/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)
#從母體環(huán)境脫離
os.chdir("/")
os.umask(0)
os.setsid()
#執(zhí)行第二次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)
#進(jìn)程已經(jīng)是守護(hù)進(jìn)程了,重定向標(biāo)準(zhǔn)文件描述符
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():
'''示例函數(shù):每秒打印一個(gè)數(shù)字和時(shí)間戳'''
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()
'''
第一個(gè)fork是為了讓shell返回,同時(shí)讓你完成setsid(從你的控制終端移除,這樣就不會(huì)意外地收到信號(hào))。setsid使得這個(gè)進(jìn)程成為“會(huì)話領(lǐng)導(dǎo)(session leader)”,即如果這個(gè)進(jìn)程打開任何終端,該終端就會(huì)成為此進(jìn)程的控制終端。我們不需要一個(gè)守護(hù)進(jìn)程有任何控制終端,所以我們又fork一次。在第二次fork之后,此進(jìn)程不再是一個(gè)“會(huì)話領(lǐng)導(dǎo)”,這樣它就能打開任何文件(包括終端)且不會(huì)意外地再次獲得一個(gè)控制終端
另外說(shuō)明:
umask()函數(shù)為進(jìn)程設(shè)置文件模式創(chuàng)建屏蔽字,并返回以前的值
在shell命令行輸入:umask 就可知當(dāng)前文件模式創(chuàng)建屏蔽字
常見的幾種umask值是002,022和027,002阻止其他用戶寫你的文件,022阻止同組成員和其他用戶寫你的文件,027阻止同組成員寫你的文件以及其他用戶讀寫或執(zhí)行你的文件
rwx-rwx-rwx 代表是777 所有的人都具有權(quán)限讀寫與執(zhí)行
chmod()改變文件的權(quán)限位
int dup(int filedes) 返回新文件描述符一定是當(dāng)前文件描述符中的最小數(shù)值
int dup2(int filedes, int filedes2);這兩個(gè)函數(shù)返回的新文件描述符與參數(shù)filedes共享同一個(gè)文件表項(xiàng)。
'''
- Python守護(hù)進(jìn)程實(shí)現(xiàn)過程詳解
- python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析
- python實(shí)現(xiàn)守護(hù)進(jìn)程、守護(hù)線程、守護(hù)非守護(hù)并行
- python使用fork實(shí)現(xiàn)守護(hù)進(jìn)程的方法
- Python如何實(shí)現(xiàn)守護(hù)進(jìn)程的方法示例
- Python守護(hù)進(jìn)程和腳本單例運(yùn)行詳解
- python daemon守護(hù)進(jìn)程實(shí)現(xiàn)
- 使用Python編寫Linux系統(tǒng)守護(hù)進(jìn)程實(shí)例
- Python實(shí)現(xiàn)Linux下守護(hù)進(jìn)程的編寫方法
- Python 創(chuàng)建守護(hù)進(jìn)程的示例
相關(guān)文章
python__new__內(nèi)置靜態(tài)方法使用解析
這篇文章主要介紹了python__new__內(nèi)置靜態(tài)方法使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
詳解Django 中是否使用時(shí)區(qū)的區(qū)別
本篇文章主要介紹了詳解Django 中是否使用時(shí)區(qū)的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-06-06
python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實(shí)例解析
這篇文章主要介紹了python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實(shí)例解析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示的代碼
這篇文章主要介紹了python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-04-04
Python調(diào)用實(shí)現(xiàn)最小二乘法的方法詳解
所謂線性最小二乘法,可以理解為是解方程的延續(xù),區(qū)別在于,當(dāng)未知量遠(yuǎn)小于方程數(shù)的時(shí)候,將得到一個(gè)無(wú)解的問題。本文主要和大家分享Python調(diào)用實(shí)現(xiàn)最小二乘法的方法,需要的可以參考一下2023-04-04
python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式
這篇文章主要介紹了python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Python使用os.listdir()和os.walk()獲取文件路徑與文件下所有目錄的方法
今天小編就為大家分享一篇關(guān)于Python使用os.listdir()和os.walk()獲取文件路徑與文件下所有目錄的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Python?multiprocessing.value實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)共享的示例
本文介紹了Python中的multiprocessing.value,通過示例代碼展示了如何使用這個(gè)類實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)共享,以及使用場(chǎng)景和注意事項(xiàng)等內(nèi)容,感興趣的朋友跟隨小編一起看看吧2023-07-07
opencv用VS2013調(diào)試時(shí)用Image Watch插件查看圖片
本文主要介紹了opencv用VS2013調(diào)試時(shí)用Image Watch插件查看圖片,直接以圖片形式可視化了opencv中的Mat變量。感興趣的可以了解下2021-07-07

