'init.d'
스크립트가 init
으로 실행될 때 파이썬을 사용하기위한 특별한 고려 사항이 있습니까? (즉, 우분투 부팅)init.d 스크립트에서 파이썬을 사용할 때 특별히 고려해야 할 사항은 무엇입니까?
내가 우분투에서 테스트 한 결과로 'init.d'
스크립트에 제공된 환경 변수가 부족하여 "#!/usr/bin/env python"
을 사용하면 작동하지 않을 수 있습니다.
다른 건 없나요?
'init.d'
스크립트가 init
으로 실행될 때 파이썬을 사용하기위한 특별한 고려 사항이 있습니까? (즉, 우분투 부팅)init.d 스크립트에서 파이썬을 사용할 때 특별히 고려해야 할 사항은 무엇입니까?
내가 우분투에서 테스트 한 결과로 'init.d'
스크립트에 제공된 환경 변수가 부족하여 "#!/usr/bin/env python"
을 사용하면 작동하지 않을 수 있습니다.
다른 건 없나요?
단지 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 스크립트는 읽기를 지원하는 쉘 아래에서 실행 중입니다.
필자는 파이썬으로 작성된 일종의 데몬을 실행하고 있다고 가정합니다. 그렇지 않다면 적용되지 않을 수 있습니다.
표준 유닉스 이중 포크를하고 파일 설명자를 리디렉션하려고 할 것입니다. 이것은 내가 사용하는 것입니다 (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을 파일로 리디렉션하고 싶을 것입니다.
초기화 스크립트는 데몬이 아닙니다. –
Peter - 나는 /etc/init.d/ 디렉토리에있는 스크립트를 언급하고있다. (부팅시에 실행된다.) 이 스크립트는 파이썬으로 작성되었습니다 (왜냐하면 저는 bash를 견디지 못하기 때문입니다). – jldupont