system et exec ? - Perl - Programmation
Marsh Posté le 26-04-2007 à 17:10:48
En lançant un programme avec exec(), le nouveau programme remplace le script PERL courant.
Exemple, la commande print ne sera jamais exécutée :
exec machin |
Alors que system() "crée" en quelque sorte un processus fils, et le script PERL qui utilise system() peut ensuite continuer.
Marsh Posté le 26-04-2007 à 17:12:19
Pas du tout. La différence c'est qu'avec exec justement, il n'y a pas de père : le qui appelle exec() process est tout simplement remplacé par ce qui est exec()uté. Alors qu'avec system() au contraire, un process fils créé (avec un fork sous unix/linux), et c'est le fils qui fait ensuite un exec() (au sens C) de ce que tu passes à system().
[Grillé]
Marsh Posté le 26-04-2007 à 17:21:34
en gros si je veux que lorsque je lance le fils et que le fils continu a tourner alors que le pere a planter,
il faut que j utilise exec et pas system;
car avec system si le pere meurt le fils meurt aussi;
Marsh Posté le 26-04-2007 à 17:22:51
Non. Dans les deux cas, le fils meurt. Sauf qu'avec exec, le père ne peut plus planter parce qu'il est remplacé par fiston.
Après on sort du cadre de PERL pour entrer dans les spécificités de l'OS. Sur un unixoïde, lancer la commande précédée de "nohup" (ex : "nohup macommande &" ) permet de désolidariser le fiston du papa.
Marsh Posté le 27-04-2007 à 07:51:10
ok
je viens tester en faisant cela
Code :
|
et effectivement une fois arriver au exec,
mon script principale perds la main et il est remplacer par celui du exec
du coup c'est pas faut que je privilegie la piste du nohup
car ce que je voulais c'est si le pere meurt le fils continu a tourner;
Marsh Posté le 27-04-2007 à 10:59:03
je pensai à quelquechose dans ce genre la
Code :
|
mais apparamment si le pere plante le fils aussi
Marsh Posté le 27-04-2007 à 11:36:05
Même ligne de commande que toi, avec nohup. Le processus fils est bien rattaché au processus 1 (initd), et non au père, qui peut donc crever sans que le fils n'en soit affecté.
Par contre, le processus fils n'étant plus non plus rattaché au terminal, il n'y a plus d'entrée/sortie dessus.
Marsh Posté le 27-04-2007 à 11:39:41
je viens test en ouvrant deux shell
et en faisant un ps
quand le pere meurt les deux fils meurt aussi;
mon script se presente ainsi
code script principal
Code :
|
Marsh Posté le 27-04-2007 à 11:44:36
taiste.pl :
#! /usr/bin/perl |
taiste2.pl :
#! /usr/bin/perl |
Et ça donne :
$ taiste.pl & |
Déjà, note ici qui est le père de taiste2.pl
C'est "1" (soit initd)
Suite :
$ kill -9 11462 |
Fiston est toujours là...
Marsh Posté le 27-04-2007 à 12:01:22
je viens tester ton cas,il ressemble au miens
mais c'est pas la même chose parceque toi ton script principal tu l'appel en background
Code :
|
Marsh Posté le 27-04-2007 à 12:56:48
Aucune différence. T'es sur que quand t'as testé, le process fils n'a pas tout simplement terminé après 1 minute ?
Marsh Posté le 27-04-2007 à 13:05:53
je suis sur, parceque le process fils appel un progamme et qu'il ne se termine que lorsque se programme est fini;
Marsh Posté le 27-04-2007 à 13:08:00
Peux-tu montrer le bout de code incriminé ?
Es-tu sûr que le fichier nohup.out qui est généré automatiquement ne contient aucune erreur qu'aurait pu sortir ton script ?
Marsh Posté le 27-04-2007 à 15:13:47
deja je viens de me rendre compte
en lançant le script enfant en background,
que le script pere lançait 2 fois le meme script enfant en background.
Marsh Posté le 27-04-2007 à 16:46:15
quand je lance avec nohup
j'ai ce message chaque fois qu'il lance un script fils
Citation : |
c'est normal ?.
Marsh Posté le 27-04-2007 à 16:50:21
nan mais surtout montre pas ton code, avec Madame Soleilmoricq et Irmafatan on va se servir de nos pouvoirs téléperliques pour t'aider ...
Marsh Posté le 27-04-2007 à 17:08:00
donny3 a écrit : quand je lance avec nohup
|
"man nohup" BOURDEL §§§
Citation : FILES |
Marsh Posté le 02-05-2007 à 08:31:37
mon code commence par ça
c'est du perl donc c'est un peu logique
#!/usr/bin/perl -w
Marsh Posté le 02-05-2007 à 08:45:50
donny3 a écrit : mon code commence par ça |
nan mais c'est sur que là ça va bien nous aider ...
Marsh Posté le 02-05-2007 à 09:10:16
mon code voila
Code :
|
Marsh Posté le 02-05-2007 à 10:05:27
j'ai réessayer avec ton exemple elmoricq
quand je teste ton exemple cela fonctionne
par contre quand je teste avec le miens;
quand je tue le pere alors les enfants meurs aussi
Marsh Posté le 02-05-2007 à 17:25:15
Lis la documentation : system() fait déjà un fork().
Et y a surement un problème dans ton script...err, "finded.pl" (n'utilise pas l'anglais si tu ne sais pas le parler/l'écrire ).
Marsh Posté le 02-05-2007 à 17:29:42
il fait un fork bizarre alors
parceque le fils depend du pere
et dans finded il n y a aucun probleme
je lance tout seul il fonctionne
PS : quel rapport avec l'anglais , je vois pas le rapport;
Marsh Posté le 02-05-2007 à 17:33:01
donny3 a écrit : il fait un fork bizarre alors |
Bientôt tu vas nous sortir quoi, qu'il y a un bug dans PERL ?
donny3 a écrit : parceque le fils depend du pere |
Code ?
donny3 a écrit : PS : quel rapport avec l'anglais , je vois pas le rapport; |
Parce que "finded" est une faute horrible ?
Marsh Posté le 02-05-2007 à 22:26:56
nohup ? tu ne peux pas forker comme tout le monde et faire tout ça probablement ?
Marsh Posté le 03-05-2007 à 13:39:43
en y reflechissant bien ,
je pense pas que le fork soit la solution
je viens de relir la doc dessus et ça me parait pas trop être ce qu'il faut faire;
Marsh Posté le 03-05-2007 à 16:13:49
et y a des tas de bouts de code pour perl qui trainent qui font du deamon/daemonize
fork pas la solution ? et tu crois que system / nohup ça en fait combien de fork ...
Marsh Posté le 03-05-2007 à 16:31:38
ReplyMarsh Posté le 03-05-2007 à 16:33:50
donny3 a écrit : system il fait un fork donc je pense pas |
Ouais mais non, ce que propose taz est un peu différent.
Ceci dit, vu comment tu galères avec nohup déjà...
Marsh Posté le 03-05-2007 à 17:01:53
si t'en es à faire des system nohup en perl, bah passe à bash
Marsh Posté le 26-04-2007 à 17:05:33
salut,
Je viens de lire un peu la doc perl,
je voulais savoir
la grande difference entre exec et system
est que si dans mon script j appel un autre script perl en background avec system,si jamais le pere plante alors le fils plante;
par contre si j'utilise exec, si jamais le pere plante, le fils continu à tourner;
c'est bien cela ?
MErci.