문제

Python을 사용하기위한 특별한 고려 사항이 있습니까? 'init.d' 스크립트가 실행 중입니다 init? (즉, 우분투 부팅)

Ubuntu의 인터넷 검색/테스트를 통해 이해하는 것에서 'init.d' 스크립트가 부족하여 사용합니다 "#!/usr/bin/env python" 작동하지 않을 수도 있습니다.

다른 뭐야?

도움이 되었습니까?

해결책

이는 init.d 스크립트에서 Python의 가장 큰 문제를 강조합니다.

Python에는 사양이 없으며 ENV는 Cpython을 가리킬 필요조차 없습니다. 업그레이드하고 파이썬이 파손되면 혀를 물어야합니다. 그리고 파이썬이 SH보다 파손 될 가능성이 훨씬 높습니다 (Init.D 스크립트의 안전한 베팅). 이유, 간단한 유용성 :

ecarroll@x60s:/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)
ecarroll@x60s:/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)

Python은 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 변수로 구체적으로 말하는 것에 대해 자세히 알아볼 수 있습니다.http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.9주요 문제는 ENV의 기본값을 /etc /프로파일로 설정할 수 있다는 것입니다. 스크립트가 읽기를 지원하는 쉘 아래에서 실행되는 경우에만 실행됩니다.

다른 팁

나는 이것이 Python으로 작성된 일종의 데몬을 실행한다고 가정합니다. 그렇지 않다면 이것이 적용되지 않을 수 있습니다.

표준 UNIX 이중 포크 및 파일 설명자를 리디렉션 할 수 있습니다. 이것은 내가 사용하는 것입니다 (URL이 지금 나를 피하는 ActiveState 코드 리셉트에서 조정되었습니다).

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을 파일로 리디렉션하고 싶을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top