Supongo que esto está ejecutando algún tipo de daemon escrito en python, si no, esto puede no ser aplicable.
Probablemente querrá hacer la doble horquilla estándar de Unix y redirigir las descripciones de los archivos. Este es el que uso (Adaptado de un receptor de código ActiveState cuya url se me escapa en este momento).
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())
Simplemente ejecute esto antes de iniciar su bucle daemon y probablemente haga lo correcto.
Como nota al margen, estoy usando #!/Usr/bin/env python como la línea shebang en un script en ubuntu y está funcionando bien para mí.
Probablemente aún desee redirigir stdout/stderr a un archivo, incluso si no está ejecutando un daemon para proporcionar información de depuración.
Los scripts de inicio no son daemons. –
Peter: me refiero a un script en el directorio /etc/init.d/ (ejecutado en el momento del arranque); dicha secuencia de comandos está escrita en Python (porque no soporto bash). – jldupont