web-dev-qa-db-fra.com

Comment tailer plusieurs fichiers en utilisant tail -0f sous Linux / AIX

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

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

Sous Linux, je vois une erreur "tail: ne peut traiter qu'un seul fichier à la fois".

Sous AIX, je vois l'erreur comme "Options non valides".

Cela fonctionne bien lorsque j'utilise:

tail -f file1 -f file 2

sous Linux mais pas sous AIX.

Je souhaite pouvoir découper plusieurs fichiers en utilisant -0f ou -f sous AIX/Linux

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

42
Web Nash

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 script zsh comme:

#! /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 récursivement tous les fichiers texte du répertoire courant:

that-script '**/*.txt' .
38
Stéphane Chazelas

tail plusieurs fichiers sont étendus par GNU version tail. Avec AIX, vous n'avez pas GNU tail, donc vous ne pouvez pas faire Vous pouvez utiliser multitail à la place.

Vous pouvez installer multitail sous Linux et AIX.

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

  • Sous Linux, multitail est souvent en dépôt, vous pouvez donc l'installer facilement en utilisant le gestionnaire de packages distro:

    • Dans Debian/Ubuntu: apt-get install multitail
    • Dans Centos/Fedora: yum install multitail
9
cuonglm

Sous OSX et Linux, utilisation

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.

7
mpowered

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

tail -f file1 & tail -f file2

Je voulais pipe la sortie vers un autre processus. Dans le cas ci-dessus & faisait la pièce avant de s'exécuter en arrière-plan et seule la deuxième partie était piped à traiter

donc j'ai utilisé

tail -f file1 file2 | process

@ Stéphane ta réponse est parfaite, mais mentionne juste mon cas d'utilisation qui a un petit twist.

6
Confused

Je vais fournir un extrait de code en utilisant tmux qui peut vous donner deux fenêtres différentes que vous pouvez utiliser pour suivre 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

MISE À JOUR: L'utilisation de screen peut également attacher/détacher plusieurs sessions afin que vous puissiez également exécuter tail plusieurs fois. Je peux suggérer de faire ceci:

screen -s Tail_Server1.log

Ensuite, vous souhaitez conserver CTRL+A+D pour détacher sans tuer les sessions et ensuite:

screen -s Tail_Server2.log

Les deux exécuteront deux screens séparés, je me réfère à screen --help afin que vous puissiez l'ajuster selon la façon dont vous souhaitez que les deux écrans fonctionnent sur votre terminal.

1
ryekayo

Utilisez la doublure suivante:

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

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

Pour rompre la boucle, appuyez sur CtrlC.

0
KiriSakow

Les travaux suivants pour moi sur SunOS 5.10.

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

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

0
Raghu Sodha