Cómo ajustar múltiples archivos usando tail -0f en Linux / AIX


39

Intenté seguir dos archivos usando la opción:

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

En Linux veo un error "cola: solo puede procesar un archivo a la vez".

En AIX veo el error como "Opciones no válidas".

Esto funciona bien cuando uso:

tail -f file1 -f file 2

en Linux pero no en AIX.

Quiero poder seguir varios archivos usando -0fo -fen AIX / Linux

multitail no se reconoce en ninguno de estos sistemas operativos.


¿Has intentado usar screenpara crear dos sesiones diferentes? ¿Deberías poder usar la cola en ambas pantallas? Además, tmuxpuede hacer el trabajo también si lo tiene instalado.
ryekayo

Respuestas:


36

Qué pasa:

tail -f file1 & tail -f file2

O prefijando cada línea con el nombre del archivo:

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

Para seguir todos los archivos cuyo nombre coincide con un patrón, puede implementar el tail -f(que se lee del archivo cada segundo de forma continua) con un zshscript como:

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

Luego, por ejemplo, para seguir todos los archivos de texto en el directorio actual de forma recursiva:

that-script '**/*.txt' .

1
alguna razón para preferir el sedcamino sobre el &camino?
gilad mayani

@giladmayani Solo estoy experimentando con esto, pero el problema con la forma en que encontré es que si lo envuelves en un script obtendrás procesos fantasmas que no se cierran.
Matthieu Cormier

8

tailla versión de GNU tail amplía varios archivos. Con AIX, no tiene cola GNU, por lo que no puede hacerlo. Puedes usar multitailen su lugar.

Puede instalar multitail en Linux y AIX.

  • Con AIX, puede descargar el paquete aquí .

  • En Linux, a multitailmenudo está en repositorio, por lo que puede instalarlo fácilmente usando el administrador de paquetes de distribución:

    • En Debian / Ubuntu: apt-get install multitail
    • En Centos / Fedora: yum install multitail

1
Multitail funciona bien y la sintaxis es simple:multitail -i path/to/file1 -i path/to/file2
Housemd

6

Lo siguiente funciona bien para generar cosas en std out

tail -f file1 & tail -f file2

Quería pipela salida a otro proceso. En el caso anterior &estaba haciendo la parte antes de que se ejecutara en segundo plano y solo la segunda parte estaba siendo pipedprocesada

entonces solía

tail -f file1 file2 | process

@ Stéphane su respuesta es perfecta, pero solo menciono mi caso de uso que tiene un pequeño giro.


El punto es que tail -f file1 file2no funciona en AIX donde tail solo acepta un nombre de archivo. Puede hacer (tail -f file1 & tail -f file2) | processpara redirigir la salida estándar de ambos tails a la tubería process.
Stéphane Chazelas

5

En OSX y Linux, usando

tail -f <file1> <file2>

funciona muy bien para mi Otra cosa buena es que tiene el siguiente resultado:

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

para ayudarlo a reconocer qué salida es de qué registro.


1
agregar qpara suprimir los encabezados
Karl Pokus

1

Proporcionaré un fragmento de código tmuxque puede darle dos ventanas diferentes que puede usar para ajustar ambos archivos simultáneamente:

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

ACTUALIZACIÓN: El uso screentambién puede adjuntar / desconectar varias sesiones para que pueda ejecutar tailvarias veces también. Puedo sugerir hacer esto:

screen -s Tail_Server1.log

A continuación, querrá mantener CTRL+A+Dpara desconectar sin matar las sesiones y luego siguiente:

screen -s Tail_Server2.log

Ambos funcionarán dos por separado screens, me referiría para screen --helpque pueda ajustarlo a cómo desea que ambas pantallas funcionen en su terminal.


@WebNash disfruta :)
ryekayo

@WebNash ¿funcionó mi respuesta para lo que preguntaste?
ryekayo

0

Los siguientes trabajos para mí en SunOS 5.10.

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

Ambas colas se ejecutarán en segundo plano. Los cambios en los archivos se lanzarán a stdout. Además, puede ejecutar cualquier comando intermedio simplemente presionando enter.


... pero eso crea dos procesos que debes eliminar y mezcla STDOUT con salida en primer plano.
enviado el

0

Use el siguiente oneliner:

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

Cada 1 segundo, el script imprimirá 10 últimas líneas de la secuencia filtrada.

Para romper el bucle, presione CtrlC.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.