system et exec ?

system et exec ? - Perl - Programmation

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.

Reply

Marsh Posté le 26-04-2007 à 17:05:33   

Reply

Marsh Posté le 26-04-2007 à 17:10:48    

[:klem3i1][:ratal]

 

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
print "haha lolz\n";

 

Alors que system() "crée" en quelque sorte un processus fils, et le script PERL qui utilise system() peut ensuite continuer.


Message édité par Elmoricq le 26-04-2007 à 17:10:57
Reply

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é]


Message édité par matafan le 26-04-2007 à 17:12:55
Reply

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;

Reply

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. [:dawak]

 

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.


Message édité par Elmoricq le 26-04-2007 à 17:23:32
Reply

Marsh Posté le 27-04-2007 à 07:51:10    

ok
je viens tester en faisant cela

Code :
  1. exec ('./monscript.pl &');


 
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;

Reply

Marsh Posté le 27-04-2007 à 10:59:03    

je pensai à quelquechose dans ce genre la

Code :
  1. system ('nohup perl ./script.pl &')


mais apparamment si le pere plante le fils aussi

Reply

Marsh Posté le 27-04-2007 à 11:09:55    

Reply

Marsh Posté le 27-04-2007 à 11:28:22    

et ton script se presente comment ?

Reply

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.


Message édité par Elmoricq le 27-04-2007 à 11:36:17
Reply

Marsh Posté le 27-04-2007 à 11:36:05   

Reply

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 :
  1. ....
  2. sytem (' nohup perl ./scriptb.pl &');
  3. ...

Reply

Marsh Posté le 27-04-2007 à 11:44:36    

[:kiki]
 
taiste.pl :

#! /usr/bin/perl
 
system('nohup perl taiste2.pl &');
 
sleep 60;


 
taiste2.pl :

#! /usr/bin/perl
 
sleep 60;


 
 
 
Et ça donne :

$ taiste.pl &
[1] 11492
$ ps -f | grep taiste
  user 11492  4180  0 11:41:53 pts/188  0:00 /usr/bin/perl taiste.pl
  user 11495     1  0 11:41:53 pts/188  0:00 perl taiste2.pl


 
Déjà, note ici qui est le père de taiste2.pl  
C'est "1" (soit initd)
 
Suite :

$ kill -9 11462
Killed
$ ps -f | grep taiste
  user 11495     1  0 11:41:53 pts/188  0:00 perl taiste2.pl
$


 
Fiston est toujours là...

Reply

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 :
  1. taiste.pl &

Reply

Marsh Posté le 27-04-2007 à 12:05:34    

Aucune différence.

Reply

Marsh Posté le 27-04-2007 à 12:12:55    

teste et tu verras,je l'ai fait et sa fonctionne pas

Reply

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 ?

Reply

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;

Reply

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 ?

Reply

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.

Reply

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 :


nohup: appending output to `nohup.out'


 
c'est normal ?.

Reply

Marsh Posté le 27-04-2007 à 16:50:21    

[:w3c compliant] 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 ...

Reply

Marsh Posté le 27-04-2007 à 17:02:55    

je parie que son code commence par #!/usr/bin/perl
[:petitpois2]

Reply

Marsh Posté le 27-04-2007 à 17:08:00    

donny3 a écrit :

quand je lance avec nohup
j'ai ce message chaque fois qu'il lance un script fils

Citation :


nohup: appending output to `nohup.out'


 
c'est normal ?.


 
 
"man nohup" BOURDEL §§§   http://www.izipik.com/images/20070426/j1vb4vit36ghh9vi7l-cerveaufou.gif  
 

Citation :

FILES
     nohup.out
           the output file of the  nohup  execution  if  standard
           output  is  a terminal and if the current directory is
           writable.
 
    $HOME/nohup.out
           the output file of the  nohup  execution  if  standard
           output  is  a terminal and if the current directory is
           not writable.

Reply

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

Reply

Marsh Posté le 02-05-2007 à 08:45:50    

donny3 a écrit :

mon code commence par ça
c'est du perl donc c'est un peu logique
#!/usr/bin/perl -w


nan mais c'est sur que là ça va bien nous aider ... [:w3c compliant]

Reply

Marsh Posté le 02-05-2007 à 09:10:16    

mon code voila
 

Code :
  1. my $dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd) or
  2. die "Database connection not made: $DBI::errstr";
  3. my $req ="select * from application  where temp='PLI'";
  4. my $sth=$dbh->prepare($req);
  5. $sth->execute();
  6. while (my ($a,$b,$c,$d) = $sth->fetchrow_array())
  7. {
  8. $times = $d;
  9. my $dossier = $a;
  10. my $appli=$c;
  11. system ('nohup perl ./finded.pl -d '.$dossier.' -c '.$appli.' -b '.$b.' &');
  12. }
  13. $sth -> finish;
  14. $dbh -> disconnect;

Reply

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

Reply

Marsh Posté le 02-05-2007 à 17:15:25    

c'est possible d utiliser un fork ?

Reply

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

Reply

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;

Reply

Marsh Posté le 02-05-2007 à 17:33:01    

donny3 a écrit :

il fait un fork bizarre alors


 
[:prozac]
 
Bientôt tu vas nous sortir quoi, qu'il y a un bug dans PERL ? [:dawak]
 

donny3 a écrit :

parceque le fils depend du pere
et dans finded il n y a aucun probleme
je lance tout seul il fonctionne


 
Code ?
 

donny3 a écrit :

PS : quel rapport avec l'anglais , je vois pas le rapport;


 
Parce que "finded" est une faute horrible ? [:dawak]

Reply

Marsh Posté le 02-05-2007 à 22:26:56    

nohup ? tu ne peux pas forker comme tout le monde et faire tout ça probablement ?

Reply

Marsh Posté le 03-05-2007 à 09:30:15    

pardon TAz ?
 
ouai c'est bon find found found

Reply

Marsh Posté le 03-05-2007 à 09:31:32    

Reply

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;

Reply

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

Reply

Marsh Posté le 03-05-2007 à 16:31:38    

system il fait un fork donc je pense pas
je pense avoir trouver

Reply

Marsh Posté le 03-05-2007 à 16:33:38    

ce topic est collector ...

Reply

Marsh Posté le 03-05-2007 à 16:33:50    

donny3 a écrit :

system il fait un fork donc je pense pas
je pense avoir trouver


 
Ouais mais non, ce que propose taz est un peu différent.
 
Ceci dit, vu comment tu galères avec nohup déjà...

Reply

Marsh Posté le 03-05-2007 à 17:01:53    

si t'en es à faire des system nohup en perl, bah passe à bash

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed