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