Fichier journal de queue sur plusieurs machines sur ssh

37

J'essaie de créer tailun 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.logsur 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…

  1. Ajoutez -t flag à ssh.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. 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-sshqui 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 sshsi possible.

PS je ne veux pas utiliser multitailou similaire puisque je veux pouvoir exécuter des commandes arbitraires.

deephacks
la source
Vous pouvez commander dbitailet le télécharger à partir d' ici .

Réponses:

36

Ce que vous voyez est l’effet d’un tampon stdout standard grepfourni 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:

ssh server "tail -f /var/log/server.log | grep test"

exécute la totalité de la commande entre les guillemets sur le serveur - grepattend donc de remplir son tampon.

ssh server tail -f /var/log/server.log | grep test

s'exécute grepsur votre ordinateur local sur la sortie tailenvoyée via le canal ssh.

La partie clé ici est, qui grepajuste son comportement selon qu’il s’agisse stdinou non d’un terminal. Lorsque vous exécutez ssh -t, la commande à distance s'exécute avec un terminal de contrôle et la télécommande grepse comporte donc comme votre locale.

Peterph
la source
Merci beaucoup pour l'explication détaillée. Cela a du sens pour moi maintenant et le script fonctionne comme prévu avec --line-buffered.
deephacks
@deephacks Dans ce cas, veuillez envisager d'accepter la réponse - cela donne une indication aux autres personnes ayant le même problème.
Peter
1
La mise en mémoire tampon de grep / glibc dépend de sa sortie standard . ssh tail | grepsorties 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).
dave_thompson_085
2

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:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
LeoChu
la source
3
Mais cela ne vous permet pas de le faire sur ssh, ce qui est une condition de cette question. (Et, aussi, la question dit expressément « ne veulent pas utiliser multitail ».)
évêque
1
@bishop: Je pense que cette critique est en partie injuste car, même si la question a peut-être été spécifiée de ne pas utiliser le multitail, cela semble être dû à un malentendu. L'exemple ci-dessus montre comment utiliser des commandes arbitraires et les extensions du shell classiques fonctionnent également 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.
Chris Adams
0

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)

Philippe Schweitzer
la source