اعتبارات خاصة لاستخدام بيثون في السيناريو init.d؟

StackOverflow https://stackoverflow.com/questions/1405555

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك أي اعتبارات خاصة لاستخدام بيثون في برنامج نصي 'init.d' تدار من خلال init؟ (أي تمهيد أوبونتو)

وحسب ما فهمت من خلال غوغلينغ / اختبار على أوبونتو، ومتغيرات البيئة المقدمة للبرنامج نصي 'init.d' نادرة وذلك باستخدام "#!/usr/bin/env python" قد لا تعمل.

وأي شيء آخر؟

هل كانت مفيدة؟

المحلول

وهذا مجرد يسلط الضوء على أكبر مشكلة مع الثعبان في برنامج نصي init.d - وأضاف التعقيد.

وبيثون لا يوجد لديه مواصفات والحياة الفطرية لم يقم حتى للإشارة إلى سي بايثون. إذا الترقية وفواصل الثعبان، سيكون لديك لدغة لسانك. وهناك فرصة أكبر بكثير أن الثعبان سيتم قطع من ش (الرهان الآمن للمخطوطات 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)

وبيثون هو ربط إلى 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

ويمكنك تقرأ المزيد عن ما كنت تتحدث تحديدا عن مع متغيرات الحياة الفطرية هنا: http://www.debian.org/doc/ ديبيان السياسة / CH-opersys.html # s9.9 هو أن التخلف عن الحياة الفطرية يمكن تعيين المشكلة الرئيسية في / etc / ملف التي من شأنها أن تعمل فقط إذا كان يتم تشغيل البرنامج النصي تحت قذيفة يدعم القراءة.

نصائح أخرى

وانا افترض ان هذا يشغل نوعا من شيطان مكتوبة في بيثون، إن لم يكن ثم هذا قد لا تنطبق.

وسوف (ربما) تريد أن تفعل يونكس القياسية شوكة مزدوجة وتوجيه واصفات ملف شيء. هذا هو واحد يمكنني استخدام (مقتبس من recepie كود 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())

ومجرد تشغيل هذا قبل بدء حلقة الخفي وأنه من المحتمل أن تفعل الشيء الصحيح.

وكملاحظة جانبية، وأنا باستخدام #! / البيرة / بن / الحياة الفطرية الثعبان كخط كوخ في برنامج نصي على أوبونتو وأنها تعمل بشكل جيد بالنسبة لي.

وأنت ربما لا تزال ترغب في إعادة توجيه المعياري / ستدير إلى ملف حتى لو لم تقم بتشغيل البرنامج الخفي لتوفير معلومات التصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top