Jak ogonić wiele plików za pomocą tail -0f w Linux / AIX

39

Próbowałem ogonić dwa pliki za pomocą opcji:

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

W systemie Linux pojawia się błąd „ogon: może przetwarzać tylko jeden plik na raz”.

W systemie AIX widzę błąd jako „nieprawidłowe opcje”.

Działa to dobrze, gdy używam:

tail -f file1 -f file 2

w systemie Linux, ale nie w systemie AIX.

Chcę mieć możliwość dopasowania wielu plików za pomocą -0flub -fw systemie AIX / Linux

multitail nie jest rozpoznawany w żadnym z tych systemów operacyjnych.

Web Nash
źródło
Czy próbowałeś screenutworzyć dwie różne sesje? Powinieneś być w stanie używać ogona na obu ekranach? Ponadto, tmuxmoże wykonać pracę, a także, jeśli masz go zainstalowanego.
ryekayo

Odpowiedzi:

36

Co powiesz na:

tail -f file1 & tail -f file2

Lub poprzedzając każdą linię nazwą pliku:

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

Aby śledzić wszystkie pliki, których nazwa pasuje do wzorca, możesz zaimplementować tail -f(który czyta z pliku co sekundę w sposób ciągły) za pomocą zshskryptu:

#! /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

Następnie, na przykład, aby rekurencyjnie śledzić wszystkie pliki tekstowe w bieżącym katalogu:

that-script '**/*.txt' .
Stéphane Chazelas
źródło
1
czy jest jakiś powód, aby preferować sed&drogę?
gilad mayani
@ Giladmayani Po prostu eksperymentuję z tym, ale problem ze sposobem i sposobem, który znalazłem, jest taki, że jeśli owiniesz go w skrypcie, dostaniesz procesy ducha, które się nie poddają.
Matthieu Cormier
8

tailwiele plików jest rozszerzanych o wersję GNU tail. W systemie AIX nie masz ogona GNU, więc nie możesz tego zrobić. Zamiast tego możesz użyć multitail.

Możesz zainstalować multitail zarówno w systemie Linux, jak i AIX.

  • W systemie AIX możesz pobrać pakiet tutaj .

  • W Linuksie multitailczęsto jest w repozytorium, więc możesz go łatwo zainstalować za pomocą menedżera pakietów dystrybucyjnych:

    • W Debian / Ubuntu: apt-get install multitail
    • W Centos / Fedora: yum install multitail
Cuonglm
źródło
1
Multitail działa ładnie, a składnia jest prosta:multitail -i path/to/file1 -i path/to/file2
Housemd
6

Następująca rzecz działa dobrze, aby wyprowadzać rzeczy na standardowe wyjście

tail -f file1 & tail -f file2

Chciałem uzyskać pipedane wyjściowe do innego procesu. W powyższym przypadku część &była wykonywana przed uruchomieniem w tle, a pipedprzetwarzana była tylko druga część

więc użyłem

tail -f file1 file2 | process

@ Stéphane twoja odpowiedź jest idealna, ale po prostu wspominając o moim przypadku użycia, który ma mały zwrot.

zmieszany
źródło
Chodzi o to, że tail -f file1 file2nie działa w systemie AIX, w którym tail akceptuje tylko jedną nazwę pliku. Możesz zrobić, (tail -f file1 & tail -f file2) | processaby przekierować standardowe wyjście obu tails do potoku do process.
Stéphane Chazelas,
5

W OSX i Linux za pomocą

tail -f <file1> <file2>

działa dla mnie świetnie. Kolejną miłą rzeczą jest to, że ma następujące dane wyjściowe:

==> /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

aby pomóc Ci rozpoznać, z którego wyjścia pochodzi dany dziennik.

mpowered
źródło
1
dodaj, qaby ukryć nagłówki
Karl Pokus
1

Dostarczę fragment kodu, tmuxktóry może dać ci dwa różne okna, których możesz użyć do ogonienia obu plików jednocześnie:

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

AKTUALIZACJA: Używanie screenmoże również dołączać / odłączać wiele sesji, dzięki czemu można również uruchamiać tailwiele razy. Mogę zasugerować zrobienie tego:

screen -s Tail_Server1.log

Następnie chcesz przytrzymać, CTRL+A+Daby odłączyć bez zabijania sesji, a następnie:

screen -s Tail_Server2.log

Oba będą działały dwa osobno screens, odniosę się do screen --helptego, abyś mógł dostosować go do tego, jak chcesz, aby oba ekrany działały na twoim terminal.

ryekayo
źródło
@WebNash enjoy :)
ryekayo
@WebNash czy moja odpowiedź zadziałała na to, o co prosiłeś?
ryekayo
0

Poniższe prace dla mnie w SunOS 5.10.

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

Oba ogony będą działać w tle. Zmiany w plikach zostaną wyrzucone na standardowe wyjście. Ponadto możesz uruchomić dowolne polecenie pomiędzy, naciskając klawisz Enter.

Raghu Sodha
źródło
... ale to tworzy dwa procesy, które musisz zabić i łączy STDOUT z wyjściem pierwszego planu.
mpowered
0

Użyj następującego oneliner:

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

Co 1 sekundę skrypt wypisze 10 ostatnich wierszy filtrowanego strumienia.

Aby przerwać pętlę, naciśnij CtrlC.

KiriSakow
źródło