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

Résolu
Alexis -  
-
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

 
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

 
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