Comment faire pour Frayer les Processus Enfants qui Ne Meurent pas avec le Parent?
J'ai un programme C++ qui agit comme un chien de garde sur les autres. S'il détecte qu'un processus n'est plus en cours d'exécution, il redémarre via system
. Le problème est que si je tue le chien de garde de processus, les processus qu'il a commencé aussi à mourir.
void* ProcessWatchdog::worker(void* arg)
{
//Check if process is running
if( !processRunning )
system("processName /path/to/processConfig.xml &");
}
L'enfant, le processus est démarré correctement et fonctionne sans aucun problème. Mais lorsque le parent (maintenant ce ProcessWatchdog
processus) meurt, l'enfant meurt trop. Comment puis-je générer un processus enfant qui est totalement indépendant de la société mère?
J'ai essayé d'utiliser pclose
et popen
, l'exécution de scripts shell les processus, et quelques autres tactiques, mais en vain. Je suis ignorant SIGHUP
signaux dans le processus enfants, mais ils continuent à mourir.
Donc, idéalement, je voudrais dire que le système de démarrer un processus qui est totalement indépendant de la société mère. Je veux de l'enfant trace
à la fin, avec l'enfant, et pour elle de/le système n'ont aucune idée de qui ProcessWatchdog
a commencé à en premier lieu.
Est-il un moyen pour que je puisse faire cela?
J'écris ceci en C++ sur Linux.
Je ne pense pas qu'à l'aide du système est une bonne idée....
Pourquoi ne pas utiliser un système une bonne idée? Outre les évidents problèmes de sécurité? Je fais cela sur un système embarqué dans un environnement très contrôlé, et je ne suis pas inquiet à propos erronés, les appels système. Est-il une autre raison que je devrais être prudent?
pour les questions de sécurité et si /bin/sh n'existe pas, vous allez avoir un certain genre de problème
merci pour l'info. Dans l'avenir, je vais faire attention, mais dans ce cas, le système est fermé et contrôlé, et la sécurité n'est pas un problème.
OriginalL'auteur zachd1_618 | 2013-07-11
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
system
avecsetsid
avant le nom du processus.Cela permettra de lancer le programme dans une nouvelle session.
OriginalL'auteur dinkelk
Celui-ci est un peu vieux mais n'a pas obtenu une réponse complète. Voici ce que j'ai fait sur un système embarqué pour frayer un bash enfant n'a pas de relation à la mère. Notez que je execl un shell bash, puis exécutez ma commande dans un autre shell bash. Cela peut ne pas être nécessaire dans votre situation. Pour moi, il m'a permis de faire quelques redirection d'e/S qui ne fonctionnent pas correctement sans elle.
Les deux concepts importants sont le setsid() et le double fork(). La combinaison de ces deux empêche un zombie d'être créé lorsque l'enfant orphelin est terminée, ainsi que la prévention de l'enfant orphelin d'être tué si le parent se termine.
Il y a beaucoup d'autres problèmes qui pourraient surgir, comme hérité I/O poignées, répertoire de travail, etc, mais ce code n'est le travail de base.
OriginalL'auteur grubs
Ne pas utiliser
system(...)
il n'est pas multi-thread safe.execv besoin d'un char** dans le second param
OriginalL'auteur lcs
Vous devez éviter l'utilisation de système.
et aussi, si vous voulez vérifier la valeur de retour ou quoi que ce soit d'autre
Aller juste pour
execl
OriginalL'auteur Alexis
Vous pouvez être intéressé par la démon(3) fonction de la bibliothèque (à l'interne à l'aide de deux imbriqués fork(2) syscalls). Après cela, utiliser le execve(2) syscall (ou liées exec(3) fonctions)...
Vous devriez lire Advanced Linux Programmation pour plus d'.
OriginalL'auteur Basile Starynkevitch
Il y a un execvp exemple dans https://github.com/w-A-L-L-e/wash/blob/master/src/wash.cpp. Passage de la ligne de commande args est parfois un problème avec exec* fonctions de unistd et l'obtention de l'environnement passé peut être un peu de travail. De toute façon, j'espère que ça aide...
OriginalL'auteur wschrep