Я предполагаю, что на этом запущен какой-то демон, написанный на python, если нет, то это может не примениться.
Вы, вероятно, захотите сделать стандартную двойную вилку unix и перенаправить файловые дескрипторы. Это тот, который я использую (адаптирован из получателя кода 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 в скрипте на ubuntu, и он отлично работает для меня.
Возможно, вы все же захотите перенаправить stdout/stderr в файл, даже если вы не используете демона для предоставления информации об отладке.
скрипты инициализации не являются демонами. –
Peter - Я имею в виду скрипт в каталоге /etc/init.d/ (выполняется во время загрузки); указанный сценарий написан на Python (потому что я не могу выдержать bash). – jldupont