Pythonデーモン


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
    "
     % (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
    "
     % (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はバックグラウンドで動作します!~~