Lancement d'une commande via system(1,"$cmd");

Résolu
Alexis -  
Char Snipeur Messages postés 10112 Statut Contributeur -
Bonjour,


J'ai réalisé un programme me permettant de lancer plusieurs process en parallèles.
Pour se faire j'utilise
system(1,"$cmd");

(afin que mon script n'attende pas le retour des executions).

Mon problème est le suivant:
Mon script fonctionne très bien sous Windows mais plante sous Unix (erreur: Can't exec "1": No such file or directory at LVL1_0.22.pl line 633.)

Je me pose donc la question s'il est bien possible d'utiliser un system(1,"") sous Unix?

Merci d'avance pour votre aide.

Alexis
A voir également:

3 réponses

Alexis
 
Bon finalement j'ai réussi à résoudre mon problème en utilisant un fork() de la manière suivante.

foreach my $i (1, 2, 3) {  
    my $pid = fork();  
    if ($pid==0) { # child  
        exec("perl C:\\repertoire\\test_2.pl $i");  
        die "Exec $i failed: $!\n";  
    } elsif (!defined $pid) {  
        warn "Fork $i failed: $!\n";  
    }  
}


Mon code fonctionne maintenant normalement sous Windows et sous Unix

Merci pour votre aide !!! :-D
2
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Bonjour Alexis,

Avec Perl, pour lancer une commande système sans attendre son retour, tu dois utiliser exec :

https://perldoc.perl.org/functions/exec

Ce que tu utilises est une particularité du portage de Perl de la commande system sous Windows, signalée ainsi par perlport (https://perldoc.perl.org/perlport#system)

As an optimization, may not call the command shell specified in $ENV{PERL5SHELL} . system(1, @args) spawns an external process and immediately returns its process designator, without waiting for it to terminate. Return value may be used subsequently in wait or waitpid. Failure to spawn() a subprocess is indicated by setting $? to "255 << 8". $? is set in a way compatible with Unix (i.e. the exitstatus of the subprocess is obtained by "$?>> 8", as described in the documentation). (Win32)

Cela n'est pas du Perl portable https://perldoc.perl.org/functions/system et c'est normal que cela ne fonctionne que sous Win32.


Dal
0
Alexis
 
Merci pour ces précisions concernant l'utilisation de system().

J'avais bien pensé à l'utilisation du exec() mais je souhaiterai en lancer plusieurs à la suite sans sortir de mon programme. Or d'après ce que j'ai pu lire sur le net et les tests que j'ai pu faire avec le exec(), ce n'est pas faisable?

Sauf s'il y a une utilisation particulière dont je n'ai pas connaissance... (ce qui est fort possible)

Aurais tu une solution à ce problème ?

Merci d'avance ;)
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
utilise system à un argument (standard) mais ajoute un "&" à la fin de ta ligne de commande.
C'est comme ça que je fais et ça fonctionne bien.
0
Alexis
 
Merci pour ta réponse.

Aurais tu un exemple à me proposer ?
Car je n'arrive pas à appliquer ta solution.. :-(

Voila ma ligne de code:

system("perl C:\\repertoire\\test_2.pl $i"); 


Tu remarquera que j'utilise une variable en paramètre de mon script appelé.

Merci d'avance pour ton retour
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
system("perl C:\\repertoire\\test_2.pl $i&");
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Cela fonctionne sous Linux, et une console Unix (avec des répertoires corrects).

Mais, en faisant

perl -e 'sleep(10); print "Hello, world!\n"' &
dans une console "cmd" sous Windows XP, cela ne me détache pas le processus chez moi.

Ou alors, j'ai raté un truc, ce qui est possible :-)


Dal
0
Alexis
 
Hello,

Finalement j'ai utilisé des exec() via un fork() (ce qui de ne ferme pas mon programme initial).
Merci de ton aide ;)
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
ça fonctionne sous Linux, c'était ça le problème, de le faire fonctionner sous Linux...
C'est sur qu'une solution portable c'est mieux.
0