Sous OS X 10.4/5/6:Darwin: comment tuer le processus parent sans tuer l'enfant?
J'ai un processus parent qui engendre un enfant. Je veux tuer le parent sans tuer l'enfant. C'est possible? Je peux modifier la source sur l'une ou l'autre application.
Sous OS X 10.4/5/6:Darwin: comment tuer le processus parent sans tuer l'enfant?
J'ai un processus parent qui engendre un enfant. Je veux tuer le parent sans tuer l'enfant. C'est possible? Je peux modifier la source sur l'une ou l'autre application.
Comme demandé par NSD, cela dépend vraiment de la façon dont il est engendré. Si vous utilisez un script shell, par exemple, vous pouvez utiliser la commande nohup
pour exécuter l'enfant. Si vous utilisez fork/exec
, alors c'est un peu plus compliqué, mais pas trop.
De http://code.activestate.com/recipes/66012/
import sys, os
def main():
""" A demo daemon main routine, write a datestamp to
/tmp/daemon-log every 10 seconds.
"""
import time
f = open("/tmp/daemon-log", "w")
while 1:
f.write('%s\n' % time.ctime(time.time()))
f.flush()
time.sleep(10)
if __name__ == "__main__":
# do the UNIX double-fork magic, see Stevens' "Advanced
# Programming in the UNIX Environment" for details (ISBN 0201563177)
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent, print eventual PID before
print "Daemon PID %d" % pid
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# start the daemon main loop
main()
Ceci est l'un des meilleurs livres jamais écrits. Il couvre ces sujets de manière détaillée et détaillée.
Programmation avancée dans l'environnement UNIX, deuxième édition (Addison-Wesley Série Professional Computing) (Broché)
ISBN-10: 0321525949
ISBN-13: 978-0321525949
5 étoiles critiques amazon (je le donnerais 6).
Le parent n'est pas un shell, c'est un système d'appel d'application C(). Y a-t-il une solution pour cela? – Stabledog
Si le parent est un shell et que vous souhaitez lancer un processus de longue durée, déconnectez-vous, prenez en compte nohup (1)
ou disown
.
Si vous contrôlez le codage de l'enfant, vous pouvez intercepter SIGHUP et le gérer d'une manière non-par défaut (comme l'ignorer complètement). Lisez les pages de manuel signal (3)
et sigaction (2)
pour obtenir de l'aide. De toute façon, il existe plusieurs questions sur StackOverflow avec une bonne aide.
Oups ... le parent n'est pas un shell, désolé. C'est un système d'appel de l'application C(). J'ai le contrôle de la source pour les deux applications, mais je ne sais pas comment empêcher la mort du parent de tuer l'enfant. – Stabledog
Comment fait-il apparaître l'enfant? –
En re: voter pour ServerFault. Je ne le vois tout simplement pas. Soit SuperUser s'il a besoin d'en savoir plus sur nohup (1), ou reste ici s'il s'agit de capture et de gestion de signal dans le processus fils. – dmckee
double tour de fourchette? – jldupont