Python守護進程(daemon)代碼執行個體

來源:互聯網
上載者:User
# -*-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+1    time.sleep(1)if __name__ == "__main__":  daemonize()  _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共用同一個檔案表項。'''
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.