Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

logger le stderr et stdout un script dans le syslog

18 réponses
Avatar
Francois Lafont
Bonsoir à tous,

Avec la commande shell « echo message | logger -t tag », je peux mettre
dans un script un message dans le syslog de ma Debian. Mais est-il possible
de faire en sorte de mettre dans le syslog _tout_ ce que pourra afficher mon
script via stderr et stdout plutôt que d'utiliser la commande logger au coup
par coup ?

Par ailleurs, mon script utilise /bin/sh et donc j'aimerais éviter les basheries
si possible. Est-ce possible de faire ça ?

J'ignore comment (d'où ma question ici) mais ne puis-je pas lancer en arrière
plan la commande logger au tout début de mon script puis ensuite faire en sorte
que le script balance stdout et stderr dans le flux d'entrée du process logger ?

--
François Lafont

10 réponses

1 2
Avatar
Philippe Weill
Le 30/06/2016 00:17, Francois Lafont a écrit :
Bonsoir à tous,
Avec la commande shell « echo message | logger -t tag », je peux mettre
dans un script un message dans le syslog de ma Debian. Mais est-il possible
de faire en sorte de mettre dans le syslog _tout_ ce que pourra afficher mon
script via stderr et stdout plutôt que d'utiliser la commande logger au coup
par coup ?
Par ailleurs, mon script utilise /bin/sh et donc j'aimerais éviter les basheries
si possible. Est-ce possible de faire ça ?
J'ignore comment (d'où ma question ici) mais ne puis-je pas lancer en arrière
plan la commande logger au tout début de mon script puis ensuite faire en sorte
que le script balance stdout et stderr dans le flux d'entrée du process logger ?

script.sh 2>&1 |logger -t tag
Avatar
Francois Lafont
Bonjour,
Merci de ta réponse, je me rends compte que j'aurais dû être plus précis dans ma question.
On 30/06/2016 07:06, Philippe Weill wrote:
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
En revanche, ça suppose que je me fasse un script wrapper qui contient ce que tu indiques
ci-dessus (autrement dit l'appel de mon script pipé dans la commande logger).
Mais est-il possible de faire cela dans le script lui-même sans passer par un wrapper ?
Par exemple avec "exec" etc. ?
--
François Lafont
Avatar
Paul Aubrin
On Thu, 30 Jun 2016 11:53:52 +0200, Francois Lafont wrote:
Bonjour,
Merci de ta réponse, je me rends compte que j'aurais dû être plus précis
dans ma question.
On 30/06/2016 07:06, Philippe Weill wrote:
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
En revanche, ça suppose que je me fasse un script wrapper qui contient
ce que tu indiques ci-dessus (autrement dit l'appel de mon script pipé
dans la commande logger).
Mais est-il possible de faire cela dans le script lui-même sans passer
par un wrapper ?
Par exemple avec "exec" etc. ?

Peut-être créer un tube nommé avec mknod
Lancer en background (&) un script (ou une ligne avec les commandes) pour
lire le tube et l'envoyer sans la syslog. rediriger stdout et stderr dans
le tube avec des exec.
Avatar
Benoit Izac
Bonjour,
Le 30/06/2016 à 11:53, Francois Lafont a écrit dans le message
<5774ec30$0$3326$ :
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
En revanche, ça suppose que je me fasse un script wrapper qui contient
ce que tu indiques ci-dessus (autrement dit l'appel de mon script pipé
dans la commande logger).
Mais est-il possible de faire cela dans le script lui-même sans passer
par un wrapper ?

#!/bin/sh
{
# ton script ici
} 2>&1 | logger -t tag
--
Benoit Izac
Avatar
Francois Lafont
Bonsoir,
On 30/06/2016 22:48, Benoit Izac wrote:
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
En revanche, ça suppose que je me fasse un script wrapper qui contient
ce que tu indiques ci-dessus (autrement dit l'appel de mon script pipé
dans la commande logger).
Mais est-il possible de faire cela dans le script lui-même sans passer
par un wrapper ?

#!/bin/sh
{
# ton script ici
} 2>&1 | logger -t tag

Effectivement c'est tout bête, j'aurais dû y penser. Bien évidemment ça
fonctionne parfaitement. Merci Benoît.
À+
--
François Lafont
Avatar
Lucas Levrel
Bonjour,
Je déterre légèrement (disons que j'époussette) ce fil...
Le 30 juin 2016, Benoit Izac a écrit :
Bonjour,
Le 30/06/2016 à 11:53, Francois Lafont a écrit dans le message
<5774ec30$0$3326$ :
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
Mais est-il possible de faire cela dans le script lui-même sans passer
par un wrapper ?

#!/bin/sh
{
# ton script ici
} 2>&1 | logger -t tag

Je viens d'utiliser ce « truc », et de m'apercevoir d'un effet de bord :
mon script (bash) commence par « set -e » pour qu'il s'interrompe si l'une
des commandes échoue. Avec le groupage { } ça ne marche plus... je suppose
parce que l'ensemble est considéré comme une unique commande.
Y a-t-il moyen de faire autrement ?
--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
Benoit Izac
Bonjour,
Le 27/07/2016 à 16:57, Lucas Levrel a écrit dans le message
 :
script.sh 2>&1 |logger -t tag

Effectivement ça répond tout à fait à la question.
Mais est-il possible de faire cela dans le script lui-même sans passer
par un wrapper ?

#!/bin/sh
{
# ton script ici
} 2>&1 | logger -t tag

Je viens d'utiliser ce « truc », et de m'apercevoir d'un effet de
bord : mon script (bash) commence par « set -e » pour qu'il
s'interrompe si l'une des commandes échoue. Avec le groupage { } ça ne
marche plus... je suppose parce que l'ensemble est considéré comme une
unique commande.
Y a-t-il moyen de faire autrement ?

Peux-tu donner un exemple minimaliste ?
avec :
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
}
ça me sort 'a' et le script s'arrête avec une valeur de retour à 1.
--
Benoit Izac
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
}
ça me sort 'a' et le script s'arrête avec une valeur de retour à 1.

Mais si tu ajoutes un « | cat » à la fin, le code de retour est 0 au lieu de
1 car le code de retour d'un pipeline est le code de retour de sa dernière
commande.
Avatar
Benoit Izac
Bonjour,
Le 27/07/2016 à 23:22, Nicolas George a écrit dans le message
<5799260b$0$5275$ :
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
}
ça me sort 'a' et le script s'arrête avec une valeur de retour à 1.

Mais si tu ajoutes un « | cat » à la fin, le code de retour est 0 au lieu de
1 car le code de retour d'un pipeline est le code de retour de sa dernière
commande.

Je n'ai pas ce comportement.
--
Benoit Izac
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
Je n'ai pas ce comportement.

Étrange. Quel protocole as-tu utilisé exactement pour tester ?
1 2