Python fork 守護程序《轉》

2021-06-22 18:34:44 字數 2574 閱讀 3401

#

-*-coding:utf-8-*-

import

sys, os

'''將當前程序fork為乙個守護程序

注意:如果你的守護程序是由inetd啟動的,不要這樣做!inetd完成了

所有需要做的事情,包括重定向標準檔案描述符,需要做的事情只有

chdir() 和 umask()了

'''def daemonize(stdin='

/dev/null

',stdout= '

/dev/null

', stderr= '

dev/null'):

'''fork當前程序為守護程序,重定向標準檔案描述符

(預設情況下定向到/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)

#從母體環境脫離

os.chdir("/"

) os.umask(0)

os.setsid()

#執行第二次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)

#程序已經是守護程序了,重定向標準檔案描述符

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():

'''示例函式:每秒列印乙個數字和時間戳

'''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+1time.sleep(1)

if__name__ == "

__main__":

daemonize(

'/dev/null

','/home/hzhida/daemon.log

','home/hzhida/daemon.log')

_example_main()

#第乙個fork是為了讓shell返回,同時讓你完成setsid(從你的控制終端移除,這樣就不會意外地收到訊號)。setsid使得這個程序成為「會話領導(session leader)」,即如果這個程序開啟任何終端,該終端就會成為此程序的控制終端。我們不需要乙個守護程序有任何控制終端,所以我們又fork一次。在第二次fork之後,此程序不再是乙個「會話領導」,這樣它就能開啟任何檔案(包括終端)且不會意外地再次獲得乙個控制終端

另外說明:

umask()函式為程序設定檔案模式建立遮蔽字,並返回以前的值

在shell命令列輸入:umask 就可知當前檔案模式建立遮蔽字

常見的幾種umask值是002,022和027,002阻止其他使用者寫你的檔案,022阻止同組成員和其他使用者寫你的檔案,027阻止同組成員寫你的檔案以及其他使用者讀寫或執行你的檔案

rwx-rwx-rwx 代表是777 所有的人都具有許可權讀寫與執行

chmod()改變檔案的許可權位

int dup(int filedes) 返回新檔案描述符一定是當前檔案描述符中的最小數值

int dup2(int filedes, int filedes2);這兩個函式返回的新檔案描述符與引數filedes共享同乙個檔案表項。

建立守護程序 轉

建立守護程序的過程 1.呼叫fork建立子程序。父程序終止,讓子程序在後台繼續執行。2.子程序呼叫setsid產生新會話期並失去控制終端呼叫setsid 使子程序程序成為新會話組長和新的程序組長,同時失去控制終端。3.忽略sighup訊號。會話組長程序終止會向其他程序發該訊號,造成其他程序終止。4....

守護程序及守護程序輸出

1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char argv else if argc...

守護程序及守護程序輸出

1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char ar else if argc 2...