2009-09-10 4 views

답변

4

단지 init.d 스크립트에서 파이썬의 가장 큰 문제점을 강조한 것입니다. 복잡성이 추가되었습니다.

파이썬에는 사양이 없으며 env는 cpython을 가리킬 필요조차 없습니다. 업그레이드하고 파이썬이 깨진다면, 당신은 당신의 혀를 물어야 할 것입니다. 그리고 python이 sh (init.d 스크립트의 안전한 베팅)보다 깨질 가능성이 훨씬 더 큽니다. 이유 존재, 간단한 유틸리티 :

 
[email protected]:/etc/init.d$ ldd /usr/bin/python 
    linux-gate.so.1 => (0xb7ff7000) 
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7fc9000) 
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fc5000) 
    libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0xb7fc0000) 
    libz.so.1 => /lib/libz.so.1 (0xb7faa000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f84000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e21000) 
    /lib/ld-linux.so.2 (0xb7ff8000) 
[email protected]:/etc/init.d$ ldd /bin/sh 
    linux-gate.so.1 => (0xb803f000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ec7000) 
    /lib/ld-linux.so.2 (0xb8040000) 

파이썬이 점 libpthread로 연결되어, libdl, libutil, libz, 가능성이 깰 수있는 다른 것들 사이에 libm의. 파이썬은 단순히 더 많은 일을하고 있습니다.

 
-rwxr-xr-x 1 root root 86K 2008-11-05 01:51 /bin/dash 
-rwxr-xr-x 1 root root 2.2M 2009-04-18 21:53 /usr/bin/python2.6 

당신에 대한 자세한 내용을 읽을 수 있습니다 당신은 여기에 구체적으로 ENV 변수를 무슨 말을하는지 : 가장 큰 문제는 ENV의 기본값은 경우에만 실행됩니다은/etc/프로파일에 설정 될 수 있는지 http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.9 스크립트는 읽기를 지원하는 쉘 아래에서 실행 중입니다.

1

필자는 파이썬으로 작성된 일종의 데몬을 실행하고 있다고 가정합니다. 그렇지 않다면 적용되지 않을 수 있습니다.

표준 유닉스 이중 포크를하고 파일 설명자를 리디렉션하려고 할 것입니다. 이것은 내가 사용하는 것입니다 (ActiveState 코드 수신자에서 적응하여 현재이 URL에서 나를 피할 수 있습니다).

def daemonize(stdin, stdout, stderr, pidfile): 
    if os.path.isfile(pidfile): 
     p = open(pidfile, "r") 
     oldpid = p.read().strip() 
     p.close() 
     if os.path.isdir("/proc/%s"%oldpid): 
      log.err("Server already running with pid %s"%oldpid) 
      sys.exit(1) 
    try: 
     pid = os.fork() 
     if pid > 0: 
      sys.exit(0) 
    except OSError, e: 
     log.err("Fork #1 failed: (%d) %s"%(e.errno, e.strerror)) 
     sys.exit(1) 
    os.chdir("/") 
    os.umask(0) 
    os.setsid() 
    try: 
     pid = os.fork() 
     if pid > 0: 
      if os.getuid() == 0: 
       pidfile = open(pidfile, "w+") 
       pidfile.write(str(pid)) 
       pidfile.close() 
      sys.exit(0) 
    except OSError, e: 
     log.err("Fork #2 failed: (%d) %s"%(e.errno, e.strerror)) 
     sys.exit(1) 
    try: 
     os.setgid(grp.getgrnam("nogroup").gr_gid) 
    except KeyError, e: 
     log.err("Failed to get GID: %s"%e) 
     sys.exit(1) 
    except OSError, e: 
     log.err("Failed to set GID: (%s) %s"%(e.errno, e.strerror)) 
     sys.exit(1) 
    try: 
     os.setuid(pwd.getpwnam("oracle").pw_uid) 
    except KeyError, e: 
     log.err("Failed to get UID: %s"%e) 
     sys.exit(1) 
    except OSError, e: 
     log.err("Failed to set UID: (%s) %s"%(e.errno, e.strerror)) 
     sys.exit(1) 
    for f in sys.stdout, sys.stderr: 
     f.flush() 
    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()) 

데몬 루프를 시작하기 전에 이것을 실행하면 올바르게 작동 할 것입니다.

우분투의 스크립트에서 #!/usr/bin/env python을 shebang 행으로 사용하고 있으며 저에게 잘 작동합니다.

디버그 정보를 제공하기 위해 데몬을 실행하지 않아도 stdout/stderr을 파일로 리디렉션하고 싶을 것입니다.

+0

초기화 스크립트는 데몬이 아닙니다. –

+0

Peter - 나는 /etc/init.d/ 디렉토리에있는 스크립트를 언급하고있다. (부팅시에 실행된다.) 이 스크립트는 파이썬으로 작성되었습니다 (왜냐하면 저는 bash를 견디지 ​​못하기 때문입니다). – jldupont

관련 문제