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

39

Tentei ajustar dois arquivos usando a opção:

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

No Linux, vejo um erro "cauda: pode processar apenas um arquivo por vez".

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

Isso funciona bem quando eu uso:

tail -f file1 -f file 2

no Linux, mas não no AIX.

Quero poder inicializar vários arquivos usando -0fou -fno AIX / Linux

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

Web Nash
fonte
Você já tentou usar screenpara criar duas sessões diferentes? Você deve conseguir usar a cauda nas duas telas? Além disso, você também tmuxpode fazer o trabalho se o tiver instalado.
precisa saber é o seguinte

Respostas:

36

Sobre o quê:

tail -f file1 & tail -f file2

Ou prefixando cada linha com o nome do arquivo:

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 o tail -f(que lê o arquivo a cada segundo continuamente) com um 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

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

that-script '**/*.txt' .
Stéphane Chazelas
fonte
1
alguma razão para preferir o sedcaminho ao longo do &caminho?
gilad mayani
@giladmayani Estou apenas experimentando isso, mas o problema com o modo que eu achei é que, se você o envolver em um script, obterá processos fantasmas que não param.
Matthieu Cormier
8

tailvários arquivos são estendidos pela versão final do GNU. Com o AIX, você não possui o GNU tail, portanto não pode fazê-lo. Você pode usar em seu multitaillugar.

É possível instalar multitail no Linux e no AIX.

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

  • No Linux, multitailgeralmente é repo, portanto você pode instalá-lo facilmente usando o gerenciador de pacotes distro:

    • No Debian / Ubuntu: apt-get install multitail
    • No Centos / Fedora: yum install multitail
cuonglm
fonte
1
O Multitail funciona bem e a sintaxe é simples:multitail -i path/to/file1 -i path/to/file2
Housemd 25/03
6

A seguinte coisa funciona bem para produzir coisas em std out

tail -f file1 & tail -f file2

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

então eu usei

tail -f file1 file2 | process

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

Confuso
fonte
O ponto é que tail -f file1 file2não funciona no AIX, em que a cauda aceita apenas um nome de arquivo. Você pode fazer (tail -f file1 & tail -f file2) | processpara redirecionar o stdout de ambos os tails para o canal para process.
Stéphane Chazelas
5

No OSX e Linux, usando

tail -f <file1> <file2>

funciona muito bem para mim. Outra coisa legal é que ele 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 ajudá-lo a reconhecer qual saída é de qual log.

mpowered
fonte
1
adicione qpara suprimir os cabeçalhos
Karl Pokus
1

Fornecerei um trecho de código usando tmuxque pode fornecer duas janelas diferentes que você pode usar para ajustar 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

ATUALIZAÇÃO: O uso screentambém pode anexar / desanexar várias sessões para que você possa executar tailvárias vezes também. Eu posso sugerir fazer isso:

screen -s Tail_Server1.log

Em seguida, você deseja segurar CTRL+A+Dpara desanexar sem interromper as sessões e depois:

screen -s Tail_Server2.log

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

ryekayo
fonte
@WebNash enjoy :)
ryekayo
@WebNash minha resposta funcionou para o que você pediu?
Rykayo
0

Os trabalhos a seguir para mim no SunOS 5.10.

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

Ambas as 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 no meio apenas pressionando enter.

Raghu Sodha
fonte
... mas isso cria dois processos que você precisa eliminar e mistura STDOUT com saída em primeiro plano.
usar o seguinte comando
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 imprimirá 10 últimas linhas do fluxo filtrado.

Para interromper o loop, pressione CtrlC.

KiriSakow
fonte