2009-12-23 22 views
0

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.

+0

Comment fait-il apparaître l'enfant? –

+1

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

+1

double tour de fourchette? – jldupont

Répondre

5

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).

+0

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

3

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.

+0

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