Comment puis-je tuer un processus parent uniquement?

10

J'ai les processus suivants.

ParentProcess
- ChildProcess
- ChildProcess
- ChildProcess

Comment puis-je tuer uniquement le processus parent? Je veux que les processus des enfants ne soient pas tués. Si j'essaie de tuer le processus parent, les enfants auront SIGHUP et seront tués.

kcm1700
la source
5
La définition d'un processus enfant est-elle liée à son parent?
Brad Patton
euh, probablement oui. Il est lié à son parent.
kcm1700

Réponses:

8

De manière générale, lorsqu'un processus devient orphelin (c'est-à-dire que son parent décède), il est adopté par init.

La situation particulière que vous décrivez s'applique probablement à un processus interactif lorsque son terminal de contrôle se ferme (de Wikipedia ):

Le signal SIGHUP est envoyé à un processus lorsque son terminal de commande est fermé. Il a été initialement conçu pour notifier le processus de coupure de ligne série. Dans les systèmes modernes, ce signal signifie généralement que le contrôle du pseudo ou du terminal virtuel a été fermé.

Pour éviter cela, les processus enfants doivent bloquer SIGHUP, donc dans la plupart des cas, vous avez besoin de la coopération du processus parent.

Si le processus parent est un shell ( bash, cshet similaire) et que vous souhaitez que les commandes que vous exécutez ne se terminent pas à la fin de bash, vous pouvez préfixer n'importe quelle commande avec nohup(from info coreutils "nohup invocation"):

'nohup' exécute la commande donnée avec les signaux de raccrochage ignorés, afin que la commande puisse continuer à s'exécuter en arrière-plan après votre déconnexion.

Dans cet exemple:

$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;

findne sera pas tué lorsque le shell se terminera et fermera le terminal de contrôle /dev/ttys000.

Si un script shell doit bloquer SIGHUP, utilisez la fonction interne trap, comme cela est expliqué ici pour bash.

jaume
la source
1
J'ai déjà ouvert le processus sans nohup, des suggestions?
kcm1700
Pour autant que je sache, vous ne pouvez pas faire grand-chose. Une fois les processus exécutés, vous ne pouvez pas modifier leur façon de réagir aux signaux.
jaume
1
Comment placer un processus déjà en cours sous nohup? stackoverflow.com/questions/625409/…
PeterVermont