且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Python 守护进程

更新时间:2022-09-22 17:03:29

 nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下:

daemonize.py


  1. #!/usr/bin/python 
  2. #coding:utf-8 
  3.  
  4. import sys 
  5. import os 
  6.  
  7. def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
  8.     try
  9.         pid = os.fork() 
  10.         if pid > 0
  11.             sys.exit(0
  12.     except OSError, e: 
  13.         sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errorno, e.strerror)) 
  14.         sys.exit(1
  15.          
  16.     os.chdir('/'
  17.     os.umask(0
  18.     os.setsid() 
  19.      
  20.     try
  21.         pid = os.fork() 
  22.         if pid > 0
  23.             sys.exit(0
  24.     except OSError, e: 
  25.         sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errorno, e.strerror)) 
  26.         sys.exit(1
  27.          
  28.     for f in sys.stdout, sys.stderr: 
  29.         f.flush() 
  30.      
  31.     si = file(stdin, 'r'
  32.     so = file(stdout, 'a+'
  33.     se = file(stderr, 'a+'0
  34.     os.dup2(si.fileno(), sys.stdin.fileno()) 
  35.     os.dup2(so.fileno(), sys.stdout.fileno()) 
  36.     os.dup2(se.fileno(), sys.stderr.fileno()) 

然后我们来调用daemonize接口,使脚本后台运行:

test.py


  1. #!/usr/bin/python 
  2. #coding:utf-8 
  3.  
  4. from daemonize import daemonize 
  5. import sys 
  6. import time 
  7.  
  8. def test(): 
  9.     while True
  10.         sys.stdout.write("Hello!"
  11.         time.sleep(1
  12.          
  13. if __name__ == "__main__"
  14.     daemonize(stdout='/home/wisp/test_print.log', stderr='/home/wisp/test_print.log'
  15.     test() 

运行test.py后,test.py就会后台运行!~~

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1047085如需转载请自行联系原作者


lihuipeng