Bagaimana mengekor beberapa file menggunakan tail -0f di Linux / AIX

39

Saya mencoba mengekor dua file menggunakan opsi:

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

Di Linux saya melihat kesalahan "tail: hanya dapat memproses satu file pada suatu waktu".

Di AIX saya melihat kesalahan sebagai "Opsi tidak valid".

Ini berfungsi dengan baik ketika saya menggunakan:

tail -f file1 -f file 2

di Linux tetapi tidak di AIX.

Saya ingin dapat mengekor banyak file menggunakan -0fatau -fdi AIX / Linux

multitail tidak dikenali dalam salah satu OS ini.

Web Nash
sumber
Sudahkah Anda mencoba menggunakan screenuntuk membuat dua sesi yang berbeda? Anda harus dapat menggunakan ekor di kedua layar? Juga, tmuxdapat melakukan pekerjaan dengan baik jika Anda telah menginstalnya.
ryekayo

Jawaban:

36

Bagaimana dengan:

tail -f file1 & tail -f file2

Atau awali setiap baris dengan nama file:

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

Untuk mengikuti semua file yang namanya cocok dengan suatu pola, Anda dapat mengimplementasikan tail -f(yang membaca dari file setiap detik terus menerus) dengan zshskrip seperti:

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

Kemudian misalnya, untuk mengikuti semua file teks dalam direktori saat ini secara rekursif:

that-script '**/*.txt' .
Stéphane Chazelas
sumber
1
ada alasan untuk lebih memilih sedjalan dari pada &jalan?
gilad mayani
@giladmayani Saya hanya bereksperimen dengan ini tetapi masalah dengan & cara yang saya temukan adalah bahwa jika Anda membungkusnya dalam skrip Anda akan mendapatkan proses hantu yang tidak berhenti.
Matthieu Cormier
8

tailbanyak file diperpanjang oleh versi ekor GNU. Dengan AIX, Anda tidak memiliki ekor GNU, jadi Anda tidak bisa melakukannya. Anda bisa menggunakannya multitail.

Anda dapat menginstal multitail di Linux dan AIX.

  • Dengan AIX, Anda dapat mengunduh paket di sini .

  • Di Linux, multitailsering kali dalam repo, sehingga Anda dapat menginstalnya dengan mudah menggunakan manajer paket distro:

    • Di Debian / Ubuntu: apt-get install multitail
    • Dalam Centos / Fedora: yum install multitail
cuonglm
sumber
1
Multitail berfungsi dengan baik dan sintaksnya sederhana:multitail -i path/to/file1 -i path/to/file2
Housemd
6

Hal berikut berfungsi dengan baik untuk menampilkan hal-hal di std out

tail -f file1 & tail -f file2

Saya ingin pipeoutput ke proses lain. Dalam kasus di atas &adalah membuat bagian sebelum berjalan di latar belakang dan hanya bagian kedua sedang pipeddiproses

jadi saya menggunakan

tail -f file1 file2 | process

@ Stéphane jawaban Anda sempurna, tetapi hanya menyebutkan use case saya yang memiliki sedikit twist.

Bingung
sumber
Intinya adalah itu tail -f file1 file2tidak bekerja pada AIX di mana tail hanya menerima satu nama file. Anda dapat melakukannya (tail -f file1 & tail -f file2) | processuntuk mengarahkan stdout keduanya tailke pipa process.
Stéphane Chazelas
5

Di OSX dan Linux, menggunakan

tail -f <file1> <file2>

bekerja bagus untukku. Hal yang menyenangkan lainnya adalah memiliki keluaran sebagai berikut:

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

untuk membantu Anda mengenali output mana dari log mana.

mowered
sumber
1
tambahkan quntuk menekan tajuk
Karl Pokus
1

Saya akan memberikan potongan kode tmuxyang dapat memberi Anda dua jendela berbeda yang dapat Anda gunakan untuk mengekor kedua file secara bersamaan:

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: Menggunakan screenjuga dapat melampirkan / melepaskan beberapa sesi sehingga Anda dapat menjalankan tailbeberapa kali juga. Saya dapat menyarankan melakukan ini:

screen -s Tail_Server1.log

Berikutnya Anda ingin menahan CTRL+A+Duntuk melepaskan tanpa membunuh sesi dan kemudian berikutnya:

screen -s Tail_Server2.log

Keduanya akan menjalankan dua terpisah screens, saya akan merujuk screen --helpsehingga Anda dapat menyesuaikannya dengan bagaimana Anda ingin kedua layar berfungsi pada Anda terminal.

ryekayo
sumber
@WebNash selamat menikmati :)
ryekayo
@ WebBash melakukan jawaban saya untuk apa yang Anda minta?
ryekayo
0

Berikut ini bekerja untuk saya di SunOS 5.10.

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

Kedua ekor akan berjalan di latar belakang. Perubahan pada file akan dibuang ke stdout. Selain itu Anda dapat menjalankan perintah apa pun di antara hanya dengan menekan enter.

Raghu Sodha
sumber
... tapi itu menciptakan dua proses yang harus Anda bunuh dan gabungkan STDOUT dengan output foreground.
mpowered
0

Gunakan oneliner berikut:

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

Setiap 1 detik, skrip akan mencetak 10 baris terakhir dari aliran yang difilter.

Untuk memutus loop, tekan CtrlC.

KiriSakow
sumber