OVH Cloud OVH Cloud

STDOUT ?

5 réponses
Avatar
Flatman
J'ai écris un script qui appelle la commande 'traceroute'
voici le script :

========================================
#! /usr/bin/perl

use strict ;

open TRACE, "/usr/sbin/traceroute apple.com|" or die "can't fork : $!" ;

my $connection = "unknown" ;

LOOP: while (<TRACE>) {
if (m/edpnet/) {
# we are connected through edpnet
$connection = "edpnet" ;
last LOOP ;
} else {
if (m/fulladsl/) {
# we are connected through fulladsl
$connection = "fulladsl" ;
last LOOP ;
}
}
} ;

close TRACE ;

print ("Connected through $connection") ;
========================================

Le script fonctionne , seulement quand je le démarre il génère du output
sur le terminal que je voudrais supprimer. Je suppose que c'est envoyé
vers STDOUT ou STDERR . Comment je fais pour éviter que cela ne soit
imprimer sur le terminal ? (sauf le output de ma commande 'print' à la
fin)


Merci

--
Erik

* Life is wonderful with Emacs and Perl *

5 réponses

Avatar
kurtz le pirate
In article ,
Flatman wrote:

::J'ai écris un script qui appelle la commande 'traceroute'
::voici le script :
::
::======================================= ::#! /usr/bin/perl
::
::use strict ;
::
::open TRACE, "/usr/sbin/traceroute apple.com|" or die "can't fork : $!" ;
::
::my $connection = "unknown" ;
::
::LOOP: while (<TRACE>) {
:: if (m/edpnet/) {
:: # we are connected through edpnet
:: $connection = "edpnet" ;
:: last LOOP ;
:: } else {
:: if (m/fulladsl/) {
:: # we are connected through fulladsl
:: $connection = "fulladsl" ;
:: last LOOP ;
:: }
:: }
::} ;
::
::close TRACE ;
::
::print ("Connected through $connection") ;
::======================================= ::
::Le script fonctionne , seulement quand je le démarre il génère du output
::sur le terminal que je voudrais supprimer. Je suppose que c'est envoyé
::vers STDOUT ou STDERR . Comment je fais pour éviter que cela ne soit
::imprimer sur le terminal ? (sauf le output de ma commande 'print' à la
::fin)


dans le terminal on peux faire un truc du genre :
la_commane >null 2>&1
pour rediriger les stout et sterr vers rien. par contre, je pense qu'il
doit y avoir beaucoup d'autres moyen de faire un traceroute en perl.

#!/usr/bin/perl -w
use strict;

my $command = "traceroute www.free.fr";
my @allLines = `$command`;
chomp(@allLines);

my $oneLine;
foreach $oneLine (@allLines) {
...
}

mais je suis aussi un grand débutant en perl, donc ce n'est qu'une toute
petite idée :))
Avatar
Flatman
* kurtz le pirate wrote:
|
| my $command = "traceroute www.free.fr";
| my @allLines = `$command`;
| chomp(@allLines);
|
| my $oneLine;
| foreach $oneLine (@allLines) {
| ...
| }

le problème c'est que le script va attendre que traceroute ait terminé !
Ma variante traite le output au fur et à mesure que traceroute s'exécute ...

--
Erik

* Life is wonderful with Emacs and Perl *
Avatar
Jogo
Sur fr.comp.lang.perl, Flatman clavardait ainsi :
Le script fonctionne , seulement quand je le démarre il génère du output
sur le terminal que je voudrais supprimer. Je suppose que c'est envoyé
vers STDOUT ou STDERR .


Surement STDERR, puisque tu récupère STDOUT dans le tube.

Comment je fais pour éviter que cela ne soit
imprimer sur le terminal ? (sauf le output de ma commande 'print' à la
fin)


Je pense qu'un truc comme ça juste avant le fork devrait marcher (pas testé) :
close STDERR ;
open STDERR,">>","/dev/null" ;

Avatar
Jean-Sébastien
Le Sat, 29 Oct 2005 12:49:37 +0200, Flatman a écrit :

[...]
Le script fonctionne , seulement quand je le démarre il génère du output
sur le terminal que je voudrais supprimer. Je suppose que c'est envoyé
vers STDOUT ou STDERR . Comment je fais pour éviter que cela ne soit
imprimer sur le terminal ? (sauf le output de ma commande 'print' à la
fin)
[...]


Ton programme récupère la sortie standard (STDOUT) pour l'analyser, mais
il laisse la sortie d'erreur (STDERR) s'afficher dans le terminal. Il
suffit donc de fermer STDERR avant de lancer le traceroute et tu ne verra
plus la ligne parasite, mais tu continuera a voir ton print qui s'affiche
sur STDOUT par défaut.


#! /usr/bin/perl

use strict ;

close STDERR;
open TRACE, "/usr/sbin/traceroute apple.com|" or die "can't fork : $!" ;

my $connection = "unknown" ;

LOOP: while (<TRACE>) {

[...]

Avatar
Flatman
Merci,

Cela fonctionne .

--
Erik

* Life is wonderful with Emacs and Perl *