Como ligar vários arquivos usando tail -0f no Linux / AIX

31

Eu tentei seguir dois arquivos usando a opção:

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

No Linux, vejo um erro "tail: pode processar apenas um arquivo de cada vez".

No AIX, vejo o erro como "Opções inválidas".

Isso funciona bem quando uso:

tail -f file1 -f file 2

no Linux, mas não no AIX.

Eu quero ser capaz de seguir vários arquivos usando -0f ou -f no AIX / Linux

multitail não é reconhecido em nenhum desses sistemas operacionais.

    
por Web Nash 07.08.2014 / 17:20

7 respostas

27

E sobre:

tail -f file1 & tail -f file2

Ou:

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

Para seguir todos os arquivos cujo nome corresponde a um padrão, você pode implementar tail -f (que é lido do arquivo a cada segundo continuamente) com um script zsh 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

Depois, por exemplo, para seguir todos os arquivos de texto no diretório atual recursivamente:

that-script '**/*.txt' .
    
por 07.08.2014 / 18:38
7

tail de vários arquivos é estendido pela versão final do GNU. Com o AIX, você não tem o GNU tail, então você não pode fazer isso. Você pode usar multitail .

Você pode instalar o multitail no Linux e no AIX.

  • Com o AIX, você pode fazer o download do pacote aqui .

  • No Linux, multitail é frequentemente repo, então você pode instalá-lo facilmente usando o gerenciador de pacotes distro:

    • No Debian / Ubuntu: apt-get install multitail
    • No Centos / Fedora: yum install multitail
por 07.08.2014 / 17:34
2

A seguinte coisa funciona bem para mostrar as coisas no std out

tail -f file1 & tail -f file2

Eu queria pipe da saída para outro processo. No caso acima, & estava fazendo a parte antes de ser executada em segundo plano e apenas a segunda parte estava sendo piped para processar

então usei

tail -f file1 file2 | process

@ Stéphane sua resposta é perfeita, mas apenas mencionando o meu caso de uso que tem uma pequena reviravolta.

    
por 16.10.2015 / 02:08
1

Eu fornecerei um snippet de código usando tmux , que pode fornecer duas janelas diferentes que você pode usar para completar os dois arquivos simultaneamente:

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: Usar screen também pode anexar / desanexar várias sessões para que você possa executar tail várias vezes também. Eu posso sugerir isso:

screen -s Tail_Server1.log

Em seguida, você deve manter CTRL+A+D para detectar sem matar as sessões e, em seguida, em seguida:

screen -s Tail_Server2.log

Ambos executarão dois screens separados, eu me referiria a screen --help para que você possa ajustá-lo a como deseja que as duas telas funcionem no seu terminal .

    
por 07.08.2014 / 17:30
0

Seguir funciona para mim no SunOS 5.10.

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

As duas caudas serão executadas em segundo plano. As alterações nos arquivos serão lançadas no stdout. Além disso, você pode executar qualquer comando entre apenas pressionando enter.

    
por 04.11.2015 / 22:01
0

No OSX e no Linux, usando

tail -f <file1> <file2>

funciona muito bem para mim. Outra coisa legal é que tem a seguinte saída:

==> /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 ajudar você a reconhecer qual saída é de qual log.

    
por 20.08.2017 / 22:09
0

Use o seguinte oneliner:

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

A cada 1 segundo, o script imprime 10 últimas linhas do fluxo filtrado.

Para quebrar o loop, pressione Ctrl C .

    
por 04.12.2018 / 15:17

Tags