#-*-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...