OVH Cloud OVH Cloud

Lancer et tuer une commande systeme

8 réponses
Avatar
Nanard
Bonjour,

J'utilise le Perl de Cygwin, mais je pense que ca ne doit rien changer
a la solution (si elle existe !).

Comment lancer une commande systeme ( system("maCommande")
`./macommande` ou autre), recuperer sont PID, attendre dans un autre
thread qques secondes/minutes, puis tuer cette commande ?

Je ne veux pas quitter mon prog avec un 'die', mais juste tuer le
thread qui execute la commande systeme.

De l'aide SVP.

Nanard

8 réponses

Avatar
s.Müller
"Nanard" a écrit dans le message de news:

Bonjour,
Comment lancer une commande systeme ( system("maCommande")
`./macommande` ou autre), recuperer sont PID, attendre dans un autre
thread qques secondes/minutes, puis tuer cette commande ?
Je ne veux pas quitter mon prog avec un 'die', mais juste tuer le
thread qui execute la commande systeme.


Je pense que tu peux t'en sortir avec qq chose de ce style:

$Pid = fork;
unless ( $Pid ) {
system( Ma commande )
}
else {
sleep xx;
kill($Pid)
}

Stéphane

Avatar
Nanard
Merci, mais mon processus reste en tant que zombie... et pourtant j'ai
mis des $SIG{CHLD} un peut partout...


my $pid = fork();
die ("Can't fork().") unless defined $pid;
if ($pid==0) {
$SIG{CLD}=sub {exit};
$SIG{CHLD}=sub {exit};;
exec("(cd ${myRep}/Main;$JAVA -jar toto.jar) ") or die ("Can't
exec()");
}
else {
$SIG{CHLD}="IGNORE";
$SIG{CLD}="IGNORE";
print "parent pid = $$ child pid=$pid n";
sleep(40);
kill (-9, $pid);
}


Une idee pour se debarasser des zombies ?
Avatar
Paul Gaborit
À (at) 14 Mar 2006 08:55:43 -0800,
"Nanard" écrivait (wrote):
Merci, mais mon processus reste en tant que zombie... et pourtant j'ai
mis des $SIG{CHLD} un peut partout...
[...]


Une idee pour se debarasser des zombies ?


Je ne sais plus pour cygwin, mais si c'est comme ActivePerl, les
'fork' ne sont pas de vrais 'fork' (juste du multi-threads) alors que
les 'exec' créent vraiment de nouveaux processus.

Peut-être en cherchant dans les modules Win32::*...


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Stéphane Müller
"Nanard" a écrit dans le message de news:

Merci, mais mon processus reste en tant que zombie... et pourtant j'ai
mis des $SIG{CHLD} un peut partout...
...

Une idee pour se debarasser des zombies ?


Ah oui exact, le fork et les appels système sous Windows sont un peu "
bizarres ". Je n'ai pas encore tout compris :-))
Tu devrais peut-être regarder du coté du module Win32::Process mais je n'ai
jamais testé ...

Avatar
Paul Gaborit
À (at) Wed, 15 Mar 2006 10:54:31 +0100,
"Stéphane Müller" écrivait (wrote):
"Nanard" a écrit dans le message de news:

Merci, mais mon processus reste en tant que zombie... et pourtant j'ai
mis des $SIG{CHLD} un peut partout...
...

Une idee pour se debarasser des zombies ?


Ah oui exact, le fork et les appels système sous Windows sont un peu "
bizarres ". Je n'ai pas encore tout compris :-))


Lire 'perlport' et en particulier la section concernant 'fork', puis
ensuite lire 'perlfork' et en particulier la section concernant
'exec'.

Tu devrais peut-être regarder du coté du module Win32::Process mais je n'ai
jamais testé ...


C'est, me semble-t-il, la meilleure solution pour piloter proprement
un autre processus sous Windows.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Nanard
Merci.

Mais mon script : je le developpe sous Windows, mais il se peut qu'un
jour il tourne sur Solaris. Une solution portable serait bien venue.
Je vais donc voir du cote de 'perlfork' 'exec' ...
Avatar
Paul Gaborit
À (at) 15 Mar 2006 05:19:40 -0800,
"Nanard" écrivait (wrote):
Mais mon script : je le developpe sous Windows, mais il se peut qu'un
jour il tourne sur Solaris. Une solution portable serait bien venue.
Je vais donc voir du cote de 'perlfork' 'exec' ...


Il y a trop de différences entre ces plateformes pour imaginer qu'une
solution générique inter-processus fonctionne efficacement. Le plus
simple est alors d'isoler correctement le code spécifique de gestion
du parallèlisme (ou du multi-porcessus) dans un module (ou dans
quelques fonctions) afin de le spécialiser facilement lors du
changement de plateforme.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Nanard
J'ai trouve !!!! au bout de 4 jours !
Au cas ou sa peut aider d'autres personnes :

Mon prog. Perl doit lancer un prog. Java, le tuer toutes les xxx
minutes, puis le relancer, etc Le tout sous cygwin.

J'ai pas reussis a tuer directement le process/thread Java lance depuis
system ou exec ou ` `
J'ai dus lancer mon prog. java dans un .bat
Puis Perl lance et tue correctement mon .bat :

my $pid = fork();
die ("Can't fork().") unless defined $pid;
if ($pid==0) {
# fils
exec ("toto.bat"); # lance java -jar toto.jar qui ne s'arrete
JAMAIS
}
else {
# pere
$SIG{CLD}="IGNORE";
print "parent pid = $$ child pid=$pid n";
sleep(40);
print "reveil, je vais tuer Java...n";
`kill $pid`;
}