OVH Cloud OVH Cloud

commande externe, stdout et stderr

1 réponse
Avatar
Benoit Izac
Bonsoir,

Je veux exécuter une commande externe et récupérer la sortie standard et
la sortie d'erreur dans mon script. Pour l'instant je fais :

use IPC::Open3;
my $stdout;
my $stderr;

my $pid = open3(undef, *FH1, *FH2, 'la commande externe');
{
local $/;
$stdout = <FH1>;
$stderr = <FH2>;
}
# faire quelque chose avec $stdout;
# faire quelque chose avec $stderr;


Je voudrais savoir si il y a une autre/meilleure solution.

Merci.
--
Benoit Izac

1 réponse

Avatar
Paul GABORIT
À (at) Sat, 05 Jun 2004 22:54:32 +0200,
Benoit Izac écrivait (wrote):
Je veux exécuter une commande externe et récupérer la sortie standard et
la sortie d'erreur dans mon script. Pour l'instant je fais :

use IPC::Open3;
my $stdout;
my $stderr;

my $pid = open3(undef, *FH1, *FH2, 'la commande externe');
{
local $/;
$stdout = <FH1>;
$stderr = <FH2>;
}
# faire quelque chose avec $stdout;
# faire quelque chose avec $stderr;


Je voudrais savoir si il y a une autre/meilleure solution.


C'est une solution... mais votre manière de lire stdout et stderr peut amener
à un deadlock (on dit aussi interblocage ou étreinte de la mort). Dans votre
cas, il suffit que la commande externe tente d'écrire un gros paquet de
données sur stderr avant d'écrire quoi que ce soit sur stdout. C'est expliqué
dans la doc de IPC::Open3. Deux solutions: vous utilisez 'select' ou
IO::Select ou une approche similaire à celle de Parallel::Jobs ou, si c'est
possible dans votre cas, vous utilisez le même filehandle pour stderr et
stdout.

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