Lancement d'une commande via system(1,"$cmd"); [Résolu/Fermé]

Signaler
-
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
-
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

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
5578
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 juin 2021
937
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
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 ;)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 289
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.
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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 289
system("perl C:\\repertoire\\test_2.pl $i&");
Messages postés
5578
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 juin 2021
937
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
Hello,

Finalement j'ai utilisé des exec() via un fork() (ce qui de ne ferme pas mon programme initial).
Merci de ton aide ;)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 289
ç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.