Python 守護程序

2022-03-03 01:28:49 字數 2740 閱讀 3341

import

osimport

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)

fork使用者將當前程序分叉,即新建乙個子程序,這樣,執行完pid=os.fork()這條語句後,就有兩個程序,這兩個程序都會獨自執行下面的**,同時每個程序都有乙個pid,子執行緒的pid為0

派生乙個守護程序後,通過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另乙個子程序,該子程序不是程序組組長,也不是會話期組長,是真正的守護程序

為了更好地觀察建立守護程序中,各種身份的變化,在這裡做乙個測試

測試**:

#

encoding=utf-8

__author__ = '

[email protected]

'import

osimport

sysfrom time import

sleep

try:

pid =os.fork()

print

'完成第一次fork

'sleep(10) #

sleep1

if pid > 0: sys.exit(0) #

exit first parent.

os.setsid()

print

'執行setsid,使子程序成為會話期組長

'sleep(10) #

sleep2

os.chdir('/

')os.umask(022) #

設定當前許可權掩碼,同時返回先前的許可權掩碼。

print

'完成修改工作目錄和許可權掩碼

'sleep(10) #

sleep3

pid =os.fork()

print

'完成第二次fork

'sleep(10) #

sleep4

if pid > 0: sys.exit(0) #

exit first parent.

print

'守護程序啟動完成

'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)

這裡一共有5個sleep,我在每個sleep都用ps -axj|grep python命令檢視程序的id變化,分別為:

標題頭:

父程序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...