[Python]daemon后台守护进程

import os
import sys

def daemonize(stdin="/dev/null", stdout="/dev/null", stderr="/dev/null"):
    try:
        pid = os.fork();
        if pid > 0:
            sys.exit(); #exit the first parent
    except OSError, e:
        sys.exit(1);
    
    os.umask(0022);
    os.setsid();
    
    try:
        pid = os.fork();
        if pid > 0:
            sys.exit(0);#exit the 2nd parent
    except OSError, e:
        sys.exit(1);
    
    si = open(stdin, 'r');
    so = open(stdout, 'a+');
    se = open(stderr, 'a+', 0);
    os.dup2(si.fileno(), sys.stdin.fileno());
    os.dup2(so.fileno(), sys.stdout.fileno());
    os.dup2(se.fileno(), sys.stderr.fileno());
记录一下以前不知道的知识:
1. os.umask(0022)
  • 权限掩码umask::umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读(4)+写(2)+执行(1),同组的和其它用户有读写权限)
  • umask的作用:默认情况下的umask值是022(可以用umask命令查看),此时你建立的文件默认权限是644(6-0,6-2,6-2),建立的目录的默认 权限是755(7-0,7-2,7-2),可以用ls -l验证一下哦 现在应该知道umask的用途了吧,它是为了控制默认权限,不要使默认的文件和目录具有全权而设的
  • 修改umask值:知道了umask的作用后,你可以修改umask的值了,例如:os.umask(0024)则以后建立的文件和目录的默认权限就为642,753了
  • 特别地,用os.umask(0)来修改文件模式,让进程有最大权限,保证进程有读写执行权限,这个不是一个好的方法
2. os.setsid()
  • 该方法做一系列的事:首先它使得该进程成为一个新会话的领导者,接下来它将进程转变一个新进程组的领导者,最后该进程不再控制终端, 运行的时候,建立一个进程,linux会分配个进程号。然后调用os.fork()创建子进程。若pid>0就是自己,自杀。子进程跳过if语句,通过os.setsid()成为linux中的独立于终端的进程(不响应sigint,sighup等)。
3. os.dup2(si.fileno(), sys.stdin.fileno())
  • 参见另外一篇有关文件描述符与重定向的文章

你可能感兴趣的:(Python)