Bonsoir � tous,
Pour un de mes projets ,j' essaye de r�aliser les actions suivantes :
- si un script est lanc� via une console, alors les sorties d'erreur et standard sont redirig�es � la fois � l'�cran et dans un fichier de log
- si le script est lanc� via la crontab ou un autre ordonnanceur, les sorties sont uniquement redigir�es dans une log
Pour cela j'utilise le code suivant :
Le soucis , en faisant un test en affichant les messages suivants:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 use File::Tee qw(tee); use IO::Interactive qw(is_interactive); my $FILE="/home/olwin/Desktop/test"; if ( is_interactive() ) { ## ici le but est d'avoir les info a l'écran + ds un fichier de log tee STDOUT, { lock => 1, mode => '>>', open => "$FILE" }; tee STDERR, { lock => 1, mode => '>>', open => "$FILE" }; }else{ ## traitement lancé en crontab ou via un ordonnanceur quelconque open(STDOUT, ">$FILE") or die "erreur lors de l'ouverture de la sortie standard"; open(STDERR, ">&STDOUT") or die "erreur lors de l'ouverture de la sortie d'erreur "; select (STDERR); # Suppression de la bufferisation de STDERR. $| = 1; select (STDOUT); # Suppression de la bufferisation de STDOUT. $| = 1; }
via crontab : j'obtient bien la bonne s�quence soit :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 print STDOUT " OUT 1"; print STDERR " ERR 1"; print STDOUT " OUT 2"; print STDERR " ERR 2";
mais lorsque je le lance via un terminal , la s�quence est incorrect , j'obtient ceci :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 OUT 1 ERR 1 OUT 2 ERR 2
Auriez vous une id�e du pourquoi ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 ERR 1 ERR 2 OUT 1 OUT 2
J'ai essay� de supprimer la bufferisation sur les 2 sorties avant d'utiliser le module File::Tee, mais cela ne fonctionne pas.
(bizarrement si je rajoute des \n dans chaque print, cela a l'air de fonctionner)
Partager