web-dev-qa-db-ja.com

Linux / AIXでtail -0fを使用して複数のファイルをテールする方法

オプションを使用して2つのファイルをテーリングしてみました。

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

Linuxでは、「tail:一度に1つのファイルしか処理できない」というエラーが表示されます。

AIXでは、エラーが「無効なオプション」と表示されます。

これは私が使用するとうまくいきます:

tail -f file1 -f file 2

linuxではなく、AIXでは。

AIX/Linuxで-0fまたは-fを使用して複数のファイルをテールできるようにしたい

multitailは、これらのOSのいずれでも認識されません。

42
Web Nash

何について:

tail -f file1 & tail -f file2

または、各行の先頭にファイルの名前を付けます。

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

名前がパターンに一致するすべてのファイルを追跡するには、次のようなzshスクリプトを使用してtail -f(ファイルから1秒ごとに継続的に読み取る)を実装できます。

#! /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' .
38

tail複数のファイルがGNUテールバージョンによって拡張されます。AIXでは、GNUテールがないため、実行できません。代わりにmultitailを使用できます。

LinuxとAIXの両方に multitail をインストールできます。

  • AIXでは、パッケージ here をダウンロードできます。

  • Linuxでは、multitailはリポジトリにあることが多いため、ディストリビューションパッケージマネージャーを使用して簡単にインストールできます。

    • Debian/Ubuntuの場合:apt-get install multitail
    • Centos/Fedoraの場合:yum install multitail
9
cuonglm

OSXおよびLinuxでは、

tail -f <file1> <file2>

私にとってはうまくいきます。もう1つの良い点は、次の出力があることです。

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

どのログからの出力かを認識するのに役立ちます。

7
mpowered

次のものは標準出力に出力するために正常に動作します

tail -f file1 & tail -f file2

別のプロセスへの出力をpipeしたいと思いました。上記の場合&は、バックグラウンドで実行する前にパーツを作成しており、2番目のパーツのみがpipedで処理されていました

だから私は使った

tail -f file1 file2 | process

@Stéphaneあなたの答えは完璧ですが、少しひねりを加えた私のユースケースに言及するだけです。

6
Confused

tmuxを使用して、両方のファイルを同時にテールするために使用できる2つの異なるウィンドウを提供できるコードスニペットを提供します。

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

どちらも2つの独立したscreensを実行します。screen --helpを参照すると、両方の画面でterminalをどのように機能させるかを調整できます。

1
ryekayo

次のワンライナーを使用します。

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

スクリプトは1秒ごとに、フィルターされたストリームの最後の10行を出力します。

ループを解除するには、 CtrlC

0
KiriSakow

以下は、SunOS 5.10での動作です。

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

両方の尾はバックグラウンドで実行されます。ファイルへの変更はstdoutにスローされます。さらに、Enterキーを押すだけで、その間に任意のコマンドを実行できます。

0
Raghu Sodha