Linux / AIX에서 tail -0f를 사용하여 여러 파일을 꼬리 처리하는 방법


39

옵션을 사용하여 두 파일을 테일링하려고했습니다.

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

Linux에서는 "꼬리 : 한 번에 하나의 파일 만 처리 할 수 ​​있습니다"라는 오류가 표시됩니다.

AIX에서는 오류가 "잘못된 옵션"으로 표시됩니다.

내가 사용할 때 잘 작동합니다.

tail -f file1 -f file 2

Linux에서는 AIX에서는 그렇지 않습니다.

내가 사용 꼬리 여러 파일을 할 수 있도록하려면 -0f또는 -fAIX / 리눅스

multitail 이 OS 중 하나에서 인식되지 않습니다.


screen두 개의 다른 세션을 만드는 데 사용해 보셨습니까 ? 두 화면에서 모두 꼬리를 사용할 수 있어야합니까? 또한 tmux설치 한 경우에도 작업을 수행 할 수 있습니다.
ryekayo

답변:


36

는 어때:

tail -f file1 & tail -f file2

또는 파일 이름으로 각 줄을 접두사로 사용하십시오.

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

이름이 패턴과 일치하는 모든 파일을 따르려면 다음 tail -f과 같은 zsh스크립트를 사용하여 (매초마다 파일에서 읽는) 파일을 구현할 수 있습니다 .

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

그런 다음 현재 디렉토리의 모든 텍스트 파일을 재귀 적으로 따르십시오.

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

1
sed도중에 길 을 선호하는 이유가 &있습니까?
gilad mayani

@giladmayani 나는 이것을 실험하고 있지만 내가 찾은 & 방법의 문제는 스크립트로 감싸면 끝내지 않는 유령 프로세스를 얻게된다는 것입니다.
Matthieu Cormier

8

tail여러 파일이 GNU tail 버전으로 확장되었습니다. AIX에서는 GNU tail이 없으므로이를 수행 할 수 없습니다. multitail대신 사용할 수 있습니다 .

Linux 및 AIX 모두에서 멀티 테일 을 설치할 수 있습니다 .

  • AIX를 사용하면 여기에서 패키지를 다운로드 할 수 있습니다 .

  • Linux에서는 multitail종종 저장소에 있으므로 배포 패키지 관리자를 사용하여 쉽게 설치할 수 있습니다.

    • 데비안 / 우분투에서 : apt-get install multitail
    • Centos / Fedora에서 : yum install multitail

1
멀티 테일은 잘 작동하고 구문은 간단합니다.multitail -i path/to/file1 -i path/to/file2
Housemd

6

다음은 std를 출력하는 데 잘 작동합니다.

tail -f file1 & tail -f file2

pipe다른 프로세스로 출력하고 싶었습니다 . 위의 경우 &백그라운드에서 실행되기 전에 파트를 작성 중이었고 두 번째 파트 만 piped처리 중 이었습니다.

그래서 나는 사용했다

tail -f file1 file2 | process

@ 스테판 (Stéphane) 당신의 대답은 완벽하지만 약간의 왜곡이있는 유스 케이스를 언급합니다.


핵심은 tail -f file1 file2tail이 하나의 파일 이름 만 허용하는 AIX에서는 작동하지 않는다는 것입니다. (tail -f file1 & tail -f file2) | process두 stdout을 tail파이프로 리디렉션하도록 할 수 있습니다 process.
Stéphane Chazelas

5

OSX 및 Linux에서

tail -f <file1> <file2>

나를 위해 잘 작동합니다. 또 다른 좋은 점은 다음과 같은 출력이 있다는 것입니다.

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

어떤 출력이 어떤 로그에서 나오는지 인식하는 데 도움이됩니다.


1
q헤더를 억제하기 위해 추가
Karl Pokus

1

tmux두 파일을 동시에 테일링하는 데 사용할 수있는 두 개의 다른 창을 제공하는 코드 스 니펫을 제공합니다.

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

업데이트 :를 사용하면 screen여러 세션을 연결 / 분리 할 수 ​​있으므로 tail여러 번 실행할 수도 있습니다. 나는 이것을 제안 할 수있다 :

screen -s Tail_Server1.log

다음으로 CTRL+A+D세션을 종료하지 않고 연결을 해제 한 후 다음을 수행 하려고합니다 .

screen -s Tail_Server2.log

모두 두 개의 별도의를 실행 screens난을 참조 것입니다, screen --help당신은 당신의 일에 두 화면을 원하는 방법으로 당신이 그것을 조정할 수 있습니다 terminal.


@WebNash enjoy :)
ryekayo

@WebNash가 요청한 내용에 대한 답변이 작동합니까?
ryekayo

0

다음은 SunOS 5.10에서 작동합니다.

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

두 꼬리 모두 백그라운드에서 실행됩니다. 파일에 대한 변경 사항이 stdout에 발생합니다. 또한 Enter 키를 눌러 명령을 실행할 수 있습니다.


...하지만 두 개의 프로세스를 생성하고 STDOUT을 포 그라운드 출력과 혼합해야합니다.
20:05에

0

다음 oneliner를 사용하십시오.

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

1 초마다 스크립트는 필터링 된 스트림의 마지막 10 줄을 인쇄합니다.

루프를 끊으려면을 누르십시오 CtrlC.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.