python守護(hù)進(jìn)程

守護(hù)進(jìn)程是生存期長(zhǎng)的一種進(jìn)程。它們獨(dú)立于控制終端并且周期性的執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件深胳。它們常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止复罐。

守護(hù)進(jìn)程的特性
1.在后臺(tái)運(yùn)行
2.與其運(yùn)行的環(huán)境隔離開來匣掸。這些環(huán)境包括未關(guān)閉的文件描述符趟紊、控制終端、會(huì)話和進(jìn)程組碰酝、工作目錄以及文件創(chuàng)建掩碼等霎匈。這些環(huán)境通常是守護(hù)進(jìn)程從它執(zhí)行它的父進(jìn)程(特別是shell)中繼承下來的
3.啟動(dòng)方式特殊,它可以在系統(tǒng)啟動(dòng)時(shí)從啟動(dòng)腳本/etc/rc.d中啟動(dòng)送爸,可以由inetd守護(hù)進(jìn)程啟動(dòng)铛嘱,可以由crond啟動(dòng)暖释,還可以由用戶終端(通常是shell)執(zhí)行

總之,除開這些特殊性以外墨吓,守護(hù)進(jìn)程與普通進(jìn)程基本上沒有什么區(qū)別饭入。因此,編寫守護(hù)進(jìn)程實(shí)際上把一個(gè)普通進(jìn)程按照上述的守護(hù)進(jìn)程的特性改造成為守護(hù)進(jìn)程肛真。

守護(hù)進(jìn)程編程規(guī)則
目的:使子進(jìn)程不會(huì)擁有控制終端谐丢,即不要繼承父進(jìn)程的進(jìn)程組id和會(huì)話組id,也就是使子進(jìn)程成為進(jìn)程組長(zhǎng)和會(huì)話組長(zhǎng)蚓让。
1.創(chuàng)建子進(jìn)程乾忱。fork產(chǎn)生子進(jìn)程,由于有父進(jìn)程历极,所以子進(jìn)程不會(huì)是進(jìn)程組長(zhǎng)和會(huì)話期組長(zhǎng)
2.脫離控制終端窄瘟。通過setid方法,使子進(jìn)程成為新的會(huì)話期組長(zhǎng)趟卸,由于該會(huì)話期只有一個(gè)蹄葱,所以該子進(jìn)程也是進(jìn)程組長(zhǎng)。這時(shí)該會(huì)話期組長(zhǎng)是沒有可控制終端的
3.禁止進(jìn)程重新打開控制終端〕校現(xiàn)在图云,進(jìn)程已經(jīng)成為無終端的會(huì)話組長(zhǎng),但它可以重新打開一個(gè)控制終端邻邮】⒖觯可以使進(jìn)程不再成為會(huì)話組長(zhǎng)來禁止進(jìn)程重新打開控制終端:
4.關(guān)閉打開的文件描述符
5.改變當(dāng)前工作目錄。(進(jìn)程活動(dòng)時(shí)筒严,其工作目錄所在的文件系統(tǒng)不能卸下丹泉。一般需要將工作目錄改變到根目錄)
6.重設(shè)文件創(chuàng)建掩碼(進(jìn)程從創(chuàng)建它的父進(jìn)程那里繼承了文件創(chuàng)建掩碼。它可能修改守護(hù)進(jìn)程所創(chuàng)建的文件的存取權(quán)限鸭蛙。為防止這一點(diǎn)摹恨,將文件創(chuàng)建掩碼清除)
7.從子進(jìn)程中fork另一個(gè)子進(jìn)程,該子進(jìn)程不是進(jìn)程組長(zhǎng)娶视,也不是會(huì)話期組長(zhǎng)晒哄,是真正的守護(hù)進(jìn)程

程序?qū)崿F(xiàn):


#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'):  
     #重定向標(biāo)準(zhǔn)文件描述符(默認(rèn)情況下定向到/dev/null)  
    try:   
        pid = os.fork()   
          #父進(jìn)程(會(huì)話組頭領(lǐng)進(jìn)程)退出贪磺,這意味著一個(gè)非會(huì)話組頭領(lǐng)進(jìn)程永遠(yuǎn)不能重新獲得控制終端硫兰。  
        if pid > 0:  
            sys.exit(0)   #父進(jìn)程退出  
    except OSError, e:   
        sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )  
        sys.exit(1)  
 #從母體環(huán)境脫離  
    os.chdir("/")  #chdir確認(rèn)進(jìn)程不保持任何目錄于使用狀態(tài),否則不能umount一個(gè)文件系統(tǒng)寒锚。也可以改變到對(duì)于守護(hù)程序運(yùn)行重要的文件所在目錄  
    os.umask(0)    #調(diào)用umask(0)以便擁有對(duì)于寫的任何東西的完全控制劫映,因?yàn)橛袝r(shí)不知道繼承了什么樣的umask违孝。  
    os.setsid()    #setsid調(diào)用成功后,進(jìn)程成為新的會(huì)話組長(zhǎng)和新的進(jìn)程組長(zhǎng)泳赋,并與原來的登錄會(huì)話和進(jìn)程組脫離雌桑。  
  
     #執(zhí)行第二次fork  
    try:   
        pid = os.fork()   
        if pid > 0:  
            sys.exit(0)   #第二個(gè)父進(jìn)程退出  
    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 = open(stdin, 'r')  
    so = open(stdout, 'a+')  
    se = open(stderr, 'a+', 0)  
    os.dup2(si.fileno(), sys.stdin.fileno())    #dup2函數(shù)原子化關(guān)閉和復(fù)制文件描述符  
    os.dup2(so.fileno(), sys.stdout.fileno())  
    os.dup2(se.fileno(), sys.stderr.fileno())  
  
#示例函數(shù):每秒打印一個(gè)數(shù)字和時(shí)間戳  
def 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('/dev/null','/tmp/daemon_stdout.log','/tmp/daemon_error.log')  
      main()  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祖今,一起剝皮案震驚了整個(gè)濱河市校坑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌千诬,老刑警劉巖耍目,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異徐绑,居然都是意外死亡邪驮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門傲茄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅访,“玉大人,你說我怎么就攤上這事盘榨∮鞔猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵较曼,是天一觀的道長(zhǎng)磷斧。 經(jīng)常有香客問我振愿,道長(zhǎng)捷犹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任冕末,我火速辦了婚禮萍歉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘档桃。我一直安慰自己枪孩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布藻肄。 她就那樣靜靜地躺著蔑舞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘹屯。 梳的紋絲不亂的頭發(fā)上攻询,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音州弟,去河邊找鬼钧栖。 笑死低零,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拯杠。 我是一名探鬼主播掏婶,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼潭陪!你這毒婦竟也來了雄妥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤依溯,失蹤者是張志新(化名)和其女友劉穎茎芭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誓沸,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梅桩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拜隧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宿百。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洪添,靈堂內(nèi)的尸體忽然破棺而出垦页,到底是詐尸還是另有隱情,我是刑警寧澤干奢,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布痊焊,位于F島的核電站,受9級(jí)特大地震影響忿峻,放射性物質(zhì)發(fā)生泄漏薄啥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一逛尚、第九天 我趴在偏房一處隱蔽的房頂上張望垄惧。 院中可真熱鬧,春花似錦绰寞、人聲如沸到逊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觉壶。三九已至,卻和暖如春件缸,著一層夾襖步出監(jiān)牢的瞬間铜靶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工停团, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旷坦,地道東北人掏熬。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秒梅,于是被迫代替她去往敵國(guó)和親旗芬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348