gilou a écrit :
Pourquoi ne pas passer par kill?
J'ai pas testé, mais je ferais ainsi pour ton premier cas
Code :
for my $hosts (@hosts) { if ($pid == 0) { &kill-me($pid); } } sub kill-me { }
|
|
En fait peut importe comment on tue le fils, tu peux envoyer un signal ou bien lui demander de faire ça lui même.
Dans mon cas, je gère effectivement les timeout des fils en envoyant des signaux de fin, mais là c'est dans le cas ou par exemple la connexion ssh plante, pour ne pas lancer les commandes suivantes de copies de fichier.
Dans ce cas le père ne peut pas savoir le statut de la commande, donc c'est au fils de se terminer, d'où le die.
Exemple :
Code :
- $scp = Net::SCP->new("$host", "user" ) or die $scp->{errstr};
- $scp->get("/tmp/mylist.tmp","$inventaire" ) or $scp->{errstr};
|
gilou a écrit :
Je ne sais pas trop ce que signifie
Code :
if ($pid == 0) { sub kill-me { }
|
car habituellement, on ne définit pas un sub à l'intérieur d'une autre procédure.
Le fils meurt et pas le père? bizarre.
A+,
|
Justement c'est ça qui le chagrine, si je ne définie pas le sub à l'intérieur de la procédure contenant le "if $pid == 0", ce n'est pas le fils qui meurt, mais le père.
Dans le cas où j'ai 150 serveurs à traiter c'est gênant, car dès qu'une connexion échoue, je dois tout recommencer.
Le problème n'est pas handicapant outre mesure car en mettant les subs a l'intérieur du code du fils ça fonctionne mais je préférerais déclarer mes subs ailleurs..
Pour le peu que je connais du fork, il me semblait que le code était dupliqué :
- Est-ce tout le code ou juste le code dans lequel on définit "if $pid==0" ?
- Est-ce possible que le fils appelle la fonction du père plutôt que de dupliquer le code ?
Message édité par bichtoubard le 19-06-2009 à 09:27:43