Comment gérer plusieurs fichiers avec tail -0f sous Linux / AIX

39

J'ai essayé de queue deux fichiers en utilisant l'option:

tail -0f file1.log -0f file2.log

Sous Linux, un message d'erreur "tail: ne peut traiter qu'un fichier à la fois".

Sous AIX, l'erreur est "Options non valides".

Cela fonctionne bien quand j'utilise:

tail -f file1 -f file 2

sous Linux mais pas sous AIX.

Je veux pouvoir gérer plusieurs fichiers avec -0fou -fsous AIX / Linux

multitail n'est reconnu dans aucun de ces systèmes d'exploitation.

Web Nash
la source
Avez-vous essayé d'utiliser screenpour créer deux sessions différentes? Vous devriez pouvoir utiliser la queue sur les deux écrans? Aussi, tmuxpeut faire le travail aussi bien si vous l'avez installé.
Ryekayo

Réponses:

36

Qu'en est-il de:

tail -f file1 & tail -f file2

Ou préfixez chaque ligne avec le nom du fichier:

tail -f file1 | sed 's/^/file1: /' &
tail -f file2 | sed 's/^/file2: /'

Pour suivre tous les fichiers dont le nom correspond à un modèle, vous pouvez implémenter le tail -f(qui lit le fichier toutes les secondes en continu) avec un zshscript du type:

#! /bin/zsh -
zmodload zsh/stat
zmodload zsh/zselect
zmodload zsh/system
set -o extendedglob

typeset -A tracked
typeset -F SECONDS=0

pattern=${1?}; shift

drain() {
  while sysread -s 65536 -i $1 -o 1; do
    continue
  done
}

for ((t = 1; ; t++)); do
  typeset -A still_there
  still_there=()
  for file in $^@/$~pattern(#q-.NoN); do
    stat -H stat -- $file || continue
    inode=$stat[device]:$stat[inode]
    if
      (($+tracked[$inode])) ||
        { exec {fd}< $file && tracked[$inode]=$fd; }
    then
      still_there[$inode]=
    fi
  done
  for inode fd in ${(kv)tracked}; do
    drain $fd
    if ! (($+still_there[$inode])); then
      exec {fd}<&-
      unset "tracked[$inode]"
    fi
  done
  ((t <= SECONDS)) || zselect -t $((((t - SECONDS) * 100) | 0))
done

Ensuite, par exemple, pour suivre tous les fichiers texte du répertoire actuel de manière récursive:

that-script '**/*.txt' .
Stéphane Chazelas
la source
1
une raison de préférer le sedchemin au &passage?
gilad mayani
@giladmayani J'expérimente cela, mais le problème avec la méthode & que j'ai trouvée est que si vous l'enveloppez dans un script, vous obtiendrez des processus fantômes qui ne s'arrêtent pas.
Matthieu Cormier
8

tailPlusieurs fichiers sont étendus par la version de queue GNU. Avec AIX, vous n'avez pas de queue GNU, vous ne pouvez donc pas le faire. Vous pouvez utiliser à la multitailplace.

Vous pouvez installer multitail sous Linux et AIX.

  • Avec AIX, vous pouvez télécharger le package ici .

  • Sous Linux, il multitailest souvent en référentiel, vous pouvez donc l'installer facilement en utilisant le gestionnaire de paquets distro:

    • Dans Debian / Ubuntu: apt-get install multitail
    • En Centos / Fedora: yum install multitail
cuonglm
la source
1
Multitail fonctionne bien et la syntaxe est simple:multitail -i path/to/file1 -i path/to/file2
Housemd
6

La chose suivante fonctionne bien pour sortir des choses sur std out

tail -f file1 & tail -f file2

Je voulais pipela sortie vers un autre processus. Dans l’affaire ci-dessus, &la pièce était créée avant d’être exécutée en arrière-plan et seule la deuxième partie était pipeddestinée à être traitée.

alors j'ai utilisé

tail -f file1 file2 | process

@ Stéphane, ta réponse est parfaite, mais je ne fais que mentionner mon cas d'utilisation qui a une petite tournure.

Confus
la source
Le fait est que tail -f file1 file2cela ne fonctionne pas sous AIX, où tail n'accepte qu'un seul nom de fichier. Vous pouvez faire (tail -f file1 & tail -f file2) | processpour rediriger la sortie standard des deux tails vers le tuyau process.
Stéphane Chazelas
5

Sous OSX et Linux, en utilisant

tail -f <file1> <file2>

fonctionne très bien pour moi. Une autre bonne chose est qu'il a la sortie suivante:

==> /srv/www/my-app/shared/log/nginx.access.log <==
things from log 1

==> /srv/www/my-app/shared/log/nginx.error.log <==
things from log 2

==> /srv/www/my-app/shared/log/nginx.access.log <==
new things from log 1

pour vous aider à reconnaître quelle sortie provient de quel journal.

puissance
la source
1
ajouter qpour supprimer les en
Karl Pokus
1

Je vais vous fournir un extrait de code tmuxqui peut vous donner deux fenêtres différentes que vous pouvez utiliser pour gérer les deux fichiers simultanément:

tmux new-window -a -n Tail
tmux new-session -d -s Tail -n SSH0 -d
tmux selectp -t Tail

#This is tmux interactions with the user (colors of the tabs used, hot keys, etc.)
tmux bind-key -n M-Left previous-window -t WinSplit
tmux bind-key -n M-Right next-window -t WinSplit
tmux set-window-option -g monitor-activity on
tmux set -g visual-activity on
tmux set-window-option -g window-status-current-bg blue
tmux set-window-option -g window-status-fg red
tmux set -g pane-border-fg yellow
tmux set -g pane-active-border-bg red
tmux set -g message-fg yellow
tmux set -g message-bg red
tmux set -g message-attr bright
tmux set -g status-left "#[fg=red]#S"

#Names two seperate windows
tmux new-window -n tail1 -t Tail
tmux new-window -n tail2 -t Tail

#Now this will allow you to automatically run tail when this tmux script is run
tmux send-keys -t Tail:0 'tail -f file1.log' C-m
tmux send-keys -t Tail:1 'tail -f file2.log' C-m

UPDATE: Using screenpeut également attacher / détacher plusieurs sessions afin que vous puissiez également exécuter tailplusieurs fois. Je peux suggérer de faire ceci:

screen -s Tail_Server1.log

Ensuite, vous voudrez tenir CTRL+A+Dà dettach sans tuer les sessions et ensuite:

screen -s Tail_Server2.log

Les deux fonctionneront deux séparément screens, je vous renvoie pour screen --helpque vous puissiez ajuster comment vous voulez que les deux écrans fonctionnent sur votre terminal.

Ryekayo
la source
@WebNash profiter :)
ryekayo
@WebNash ma réponse a-t-elle fonctionné pour ce que vous avez demandé?
Ryekayo
0

Suivre des travaux pour moi sur SunOS 5.10.

$ tail -f file1.log &
$ tail -f file2.log &
$ 

Les deux queues fonctionneront en arrière-plan. Les modifications apportées aux fichiers seront renvoyées sur stdout. De plus, vous pouvez exécuter n'importe quelle commande entre les deux en appuyant simplement sur Entrée.

Raghu Sodha
la source
... mais cela crée deux processus que vous devez éliminer et mélange STDOUT avec la sortie de premier plan.
Mpowered
0

Utilisez le oneliner suivant:

while true; do cat /path/to/numerous/folders/and/files/*/*.txt | grep "some filter" | tail -n 10; sleep 1; done

Toutes les secondes, le script imprimera les 10 dernières lignes du flux filtré.

Pour rompre la boucle, appuyez sur CtrlC.

KiriSakow
la source