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

Résolu/Fermé
Alexis - 12 mars 2013 à 18:14
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 mars 2013 à 15:03
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

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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 13/03/2013 à 11:31
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
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 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 mars 2013 à 12:27
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
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 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 mars 2013 à 20:53
system("perl C:\\repertoire\\test_2.pl $i&");
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 14/03/2013 à 13:46
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
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 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 mars 2013 à 15:03
ç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