Frage

Gibt es spezielle Überlegungen für die Verwendung von Python in einem 'init.d' Skript wird durch init laufen? (D Booten Ubuntu)

Von dem, was ich durch googeln / Test auf Ubuntu verstehen, die Umgebungsvariablen zu einem 'init.d' Skript zur Verfügung gestellt sind rar und so mit "#!/usr/bin/env python" möglicherweise nicht.

Sonst noch etwas?

War es hilfreich?

Lösung

Das gerade das größte Problem mit Python hebt in einer init.d Skript - zusätzliche Komplexität.

Python hat keine Spezifikation und die env müssen nicht einmal auf CPython zeigen. Wenn Sie ein Upgrade und Python bricht, werden Sie Ihre Zunge beißen müssen. Und es gibt eine viel größere Chance, dass Python als sh brechen (die sichere Wette für init.d Skripte). Grund dafür ist, einfaches Dienstprogramm:

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 ist die Verknüpfung in libpthread, libdl, libutil, die libz, libm unter anderem möglicherweise brechen. Python ist einfach mehr tun.

-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

Sie können mehr über lesen, was sind Sie speziell reden mit env Variablen hier: http://www.debian.org/doc/ debian-policy / ch-opersys.html # s9.9 Das Hauptproblem ist, dass die Standardeinstellungen für env können in / etc / profile eingestellt werden, die nur dann ausgeführt, wenn das Skript unter einer Shell ausgeführt werden, die es unterstützt zu lesen.

Andere Tipps

Ich gehe davon aus das ist eine Art Dämon in Python geschrieben läuft, wenn nicht, dann kann dies nicht gelten.

Sie (wahrscheinlich) wollen die Standard-Unix-Doppelgabel zu tun und Filedeskriptoren Sache umleiten. Das ist der, den ich (Angepasst von einer Active Code recepie dessen url entzieht sich mir im Moment) verwenden.

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())

Nur diese führen Sie Ihre Daemon Schleife vor der Inbetriebnahme und es wird wahrscheinlich das Richtige tun.

Als Randbemerkung, ich bin mit #! / Usr / bin / env python als Shebang-Zeile in einem Skript auf Ubuntu und es funktioniert gut für mich.

Sie werden wahrscheinlich immer noch wollen, stdout / stderr in eine Datei sogar umleiten, wenn Sie keinen Dämon laufen Debug-Informationen zur Verfügung zu stellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top