J'essaie de créer tail
un fichier journal sur plusieurs ordinateurs distants et de transférer la sortie sur mon poste de travail local. Je veux que les connexions se ferment lorsque vous appuyez sur Ctrl- C.
Pour le moment, j'ai la fonction suivante qui fonctionne presque comme prévu.
function dogfight_tail() {
logfile=/var/log/server.log
pids=""
for box in 02 03; do
ssh server-$box tail -f $logfile | grep $1 &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
trap wait
}
Les connexions se ferment et je reçois la sortie de tail
. MAIS, il y a une sorte de mise en mémoire tampon en cours parce que la sortie vient par lots.
Et voici la partie amusante…
Je peux voir le même comportement de mise en mémoire tampon lors de l'exécution de la commande suivante et ajouter «test» au fichier /var/log/server.log
sur les machines distantes 4 à 5 fois…
ssh server-01 "tail -f /var/log/server.log | grep test"
… Et trouvé deux moyens de le désactiver…
Ajoutez -t flag à ssh.
ssh -t server-01 "tail -f /var/log/server.log | grep test"
Supprimer la citation de la commande à distance.
ssh server-01 tail -f /var/log/server.log | grep test
Cependant, aucune de ces approches ne fonctionne pour la fonction qui s'exécute sur plusieurs machines mentionnées ci-dessus.
J'ai essayé dsh, qui a le même comportement de mise en mémoire tampon lors de l'exécution.
dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"
Idem ici, si je supprime la citation, la mise en mémoire tampon disparaît et tout fonctionne correctement.
dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test
Aussi essayé parallel-ssh
qui fonctionne exactement le même que dsh
. Quelqu'un peut-il expliquer ce qui se passe ici?
Comment résoudre ce problème? Serait idéal pour aller avec tout droit ssh
si possible.
PS je ne veux pas utiliser multitail
ou similaire puisque je veux pouvoir exécuter des commandes arbitraires.
dbitail
et le télécharger à partir d' ici .Réponses:
Ce que vous voyez est l’effet d’un tampon stdout standard
grep
fourni par Glibc. La meilleure solution consiste à le désactiver en utilisant--line-buffered
(GNU grep, je ne sais pas quelles autres implémentations pourraient le prendre en charge ou quelque chose de similaire).Quant à savoir pourquoi cela ne se produit que dans certains cas:
exécute la totalité de la commande entre les guillemets sur le serveur -
grep
attend donc de remplir son tampon.s'exécute
grep
sur votre ordinateur local sur la sortietail
envoyée via le canal ssh.La partie clé ici est, qui
grep
ajuste son comportement selon qu’il s’agissestdin
ou non d’un terminal. Lorsque vous exécutezssh -t
, la commande à distance s'exécute avec un terminal de contrôle et la télécommandegrep
se comporte donc comme votre locale.la source
ssh tail | grep
sorties vers le terminal local, sans tampon.ssh -t "tail|grep"
sorties vers un pty, sans tampon.ssh "tail|grep"
sorties vers un tuyau (àsshd
), tamponné (sauf--line-buffered
).regarde ça:
multitail
MultiTail vous permet de surveiller les fichiers journaux et la sortie des commandes dans plusieurs fenêtres d’un terminal, de les coloriser, les filtrer et les fusionner.
Pour créer des journaux dans plusieurs serveurs, utilisez:
la source
multitail <(ssh …) <(ssh …)
- permettant ainsi d'obtenir le résultat souhaité même si ce n'était pas la façon dont ils pensaient à l'origine de pouvoir répondre à la question.Vous pouvez vérifier dans le journal de bord.
Un outil Java que j'ai créé, capable de lire des fichiers journaux locaux et distants à l'aide de SSH. C'est assez simple à utiliser.
Quelques explications supplémentaires: https://github.com/pschweitz/insidelog/wiki
Il suffit de télécharger la version correspondant à votre système d'exploitation, de l'exécutable de la version native de jar dans votre environnement d'exécution Java (requiert java 8_40 ou version ultérieure):
https://github.com/pschweitz/insidelog/releases
Vous pouvez trouver une documentation complète (intégrée avec et dans la page de Github également)
la source