importfork使用者將當前程序分叉,即新建乙個子程序,這樣,執行完pid=os.fork()這條語句後,就有兩個程序,這兩個程序都會獨自執行下面的**,同時每個程序都有乙個pid,子執行緒的pid為0osimport
sysfrom time import
sleep
try:
pid =os.fork()
if pid > 0: sys.exit(0) #
exit parent.
pid =os.fork()
os.setsid()
os.chdir(self.curdir)
os.umask(022)
if pid > 0: sys.exit(0) #
exit parent.
except
oserror, e:
sys.stderr.write(
"fork failed: (%d) %s\n
" %(e.errno, e.strerror))
sys.exit(1)
while 1:
sleep(1)
派生乙個守護程序後,通過while來實現該程序一直在後台執行
.ps -ajx 引數說明:ppid 父程序id,pid 程序id,pgid 程序組id,sid 會話期id
乙個程序組包含多個程序,乙個會話期包含多個程序組,乙個會話期擁有乙個終端,
如果在該終端輸入退出(ctrl+c)命令,將關閉改會話期包含的所以程序
建立守護程序步驟
目的:使子程序不會擁有控制終端,即不要繼承父程序的程序組id和會話組id,也就是使子程序成為程序組組長和會話組組長
1.建立子程序。fork產生子程序,由於有父程序,所以該子程序不會是程序組組長和會話期組長
2.脫離控制終端。通過setid方法,使子程序成為 新的會話期 組長,由於該會話期只有乙個程序,所以該子程序也是程序組組長。這是改會話期組長是沒有可控制終端的
3.禁止程序重新開啟控制終端 。現在,程序已經成為無終端的會話組長,但它可以重新申請開啟乙個控制終端。可以通過使程序不再成為會話組長來禁止程序重新開啟控制終端:
4.關閉開啟的檔案描述符
5.改變當前工作目錄
6.重設檔案建立掩碼
7.從子程序中fork另乙個子程序,該子程序不是程序組組長,也不是會話期組長,是真正的守護程序
為了更好地觀察建立守護程序中,各種身份的變化,在這裡做乙個測試
測試**:
#這裡一共有5個sleep,我在每個sleep都用ps -axj|grep python命令檢視程序的id變化,分別為:encoding=utf-8
__author__ = '
'import
osimport
sysfrom time import
sleep
try:
pid =os.fork()
'完成第一次fork
'sleep(10) #
sleep1
if pid > 0: sys.exit(0) #
exit first parent.
os.setsid()
'執行setsid,使子程序成為會話期組長
'sleep(10) #
sleep2
os.chdir('/
')os.umask(022) #
設定當前許可權掩碼,同時返回先前的許可權掩碼。
'完成修改工作目錄和許可權掩碼
'sleep(10) #
sleep3
pid =os.fork()
'完成第二次fork
'sleep(10) #
sleep4
if pid > 0: sys.exit(0) #
exit first parent.
'守護程序啟動完成
'sleep(10) #
sleep5
except
oserror, e:
sys.stderr.write(
"fork failed: (%d) %s\n
" %(e.errno, e.strerror))
sys.exit(1)
while 1:
sleep(1)
標題頭:
父程序id 程序id 程序組id 會話期id
程序組或會話期的id與該程序組或會話期的組長的程序id相同
例如程序id是7000的程序,它的程序組id是6000,即7000所屬的程序組的id是6000,該程序組的組長是程序id為6000的程序,會話期同理
sleep1:
第乙個程序為父程序,第二個為子程序,他們有共同的程序組id和會話期id
sleep2:
父程序退出,剩下子程序,通過setsid命令,使子程序成為程序組組長和會話期組長
sleep3:
這個步驟id不會變化
sleep4:
子程序再fork乙個子程序,之前的子程序變成父程序,父程序與子程序擁有共同的程序組id和會話期id,
sleep5:
父程序退出,子程序既不是程序組組長也不是會話期組長,子程序與第乙個父程序完全脫離關係,子程序沒有控制終端,達到守護程序需要的條件
python守護程序
去 python daemon 1.5.2 3.el5.noarch.rpm 測試 test.py usr bin python import daemon,time print 1 p daemon.daemoncontext p.open for i in range 0,100 print t...
Python守護程序
關於python守護程序,網上查了一些資料,做下彙總 1.python例項 之五python守護程序和指令碼單例執行 2.python 模擬linux守護程序 3.python中fork 函式生成子程序分析 4.討論一下os.umask 和os.setsid 5.用python編寫linux守護程序...
python程序守護
參考 vamei python守護程序daemon實現 如何建立乙個程序 實際上,當計算機開機的時候,核心 kernel 只建立了乙個init程序。linux核心並不提供直接建立新程序的系統呼叫。剩下的所有程序都是init程序通過fork機制建立的。新的程序要通過老的程序複製自身得到,這就是fork...