假如寫一段服務端程式,如果ctrl+c退出或者關閉終端,那麼服務端程式就會退出,於是就想著讓這個程式成為守護程序,像httpd一樣,一直在後端執行,不會受終端影響。
守護程序英文為daemon,像httpd,mysqld,最後乙個字程式設計客棧母d其實就是表示daemon的意思。
守護程序的編寫步驟:
1、fork子程序,然後父程序退出,此時子程序會被init程序接管。
2、修改子程序的工作目錄,建立新程序組合新會話,修改umask。www.cppcns.com
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)
#建立孫子程序,而後子程序退出
1、fork子程序,父程序退出
通常,我們執行服務端程式的時候都會通過終端連線到伺服器,成功連線後會載入shell環境,終端盒shell都是程序,shell程序是終端程序的子程序,通過ps命令可以很容易的檢視到,在這個shell環境下一開始執行的程式都是shell程序的子程序,自然會受到shell程序的影響,在程式裡fork子程序後,父程序退出,對於shell程序來說,這個父程序就算執行完畢,而產生的子程序會被init程序接管,從而也就脫離了終端控制。
2.修改子程序的工作目錄
子程序在建立的時候會繼承父程序的工作目錄,如果執行的程式是在u盤裡面,就會導致u盤不能解除安裝。
3.建立新會話
使用setsid後,子程序就會成為新會話的首程序,子程序會成為新程序組的組長程序,子程序沒有控制終端。
4.修改umask
由於umask會遮蔽許可權,所有hlpvok設定為0,這樣可以避免讀寫檔案時碰到許可權問題
5.fork孫子程序,子程序退出
經過上面幾個步驟後,子程序會成為新的程序組老大,可以重新申請開啟終端,為了避免這個問題,程式設計客棧fork孫子程序處理,
6.重定向孫子程序的標準輸入流,標準輸出流,標準錯誤流到/dev/null
因為是守護程序,本身已經脫離了終端,那麼標準輸入流,標準輸入流,標準錯誤流就沒有什麼意義了,所以都轉向到/dev/null,就是丟棄的意思
我們來執行乙個這個程式,看看效果
從上圖可以看出這個指令碼程式已經放入後台,只能使用killall方式來結束掉,
接下來我們去看下記錄的日誌
本文標題: python daemon守護程序實現
本文位址:
linux環境程式設計 孤兒程序,殭屍程序,守護程序
前面的 程序控制我們已經陸續的介紹啦,今天介紹一下孤兒程序,殭屍程序,還有守護程序 一.孤兒程序 父程序 先於 子程序結束,那子程序就成為了孤兒程序,父程序的資源被 init程序 沒有結束的子程序就被init程序領養,init程序可以被看程是孤兒院的院長。二.殭屍程序 父程序 還在執行 子程序已經結...
守護程序VS守護執行緒
join 方法可以使乙個程序執行完之後再執行下乙個程序,而daemon 方法就是主程序的 執行完畢之後,不需要等待子程序,立即終止子程序。join 方法和daemon 方法都是改變程序順序的方法。1.daemon 方法要寫在start 方法之前。2.子程序被設定成守護程序後,一旦主程序 執行完畢,不...
守護執行緒和守護程序
守護程序隨著主程序的 的執行結束而結束 守護執行緒會在主線程結束之後等待其他子執行緒的結束才結束 如有其他子執行緒,沒有其他子執行緒就是主線程結束守護執行緒隨之結束 主程序在執行玩完自己的 後不會立即結束,而是等待子程序結束之後,子程序的資源 import time from threading i...