Як зафіксувати кілька файлів за допомогою хвоста -0f в Linux / AIX


39

Я спробував записати два файли за допомогою параметра:

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

У Linux я бачу помилку "хвіст: може обробляти лише один файл одночасно".

У AIX я бачу помилку як "Недійсні параметри".

Це добре працює, коли я використовую:

tail -f file1 -f file 2

в Linux, але не в AIX.

Я хочу , щоб мати можливість хвостових декількох файлів з допомогою -0fабо -fв AIX / Linux

multitail не розпізнається в жодній із цих ОС.


Ви намагалися використати 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 Я просто експериментую з цим, але проблема з & способом, який я знайшов, полягає в тому, що якщо ви загорнете його в сценарій, ви отримаєте привидні процеси, які не припиняються.
Матьє Корм'є

8

tailкілька файлів розширено хвостовою версією GNU. У AIX у вас немає хвоста GNU, тому ви не можете цього зробити. Ви можете використовувати multitailзамість цього.

Ви можете встановити багатоповерхівку як в Linux, так і в AIX.

  • За допомогою AIX ви можете завантажити пакет тут .

  • У Linux multitailчасто є репо, тому ви можете легко встановити його за допомогою диспетчера пакунків distro:

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

1
Multitail добре працює, а синтаксис простий:multitail -i path/to/file1 -i path/to/file2
Housemd

6

Наступна річ прекрасно виводить речі на std out

tail -f file1 & tail -f file2

Я хотів вийти pipeна інший процес. У наведеному вище випадку &складання деталі перед запуском у фоновому режимі, і лише друга частина підлягає pipedобробці

тому я звик

tail -f file1 file2 | process

@ Stéphane ваша відповідь ідеальна, але лише згадуючи мій випадок використання, який має невеликий поворот.


Справа в тому, що tail -f file1 file2він не працює на AIX, де хвіст приймає лише одне ім’я файлу. Ви можете зробити, (tail -f file1 & tail -f file2) | processщоб переспрямувати відтінок обох tails до труби на process.
Стефан Шазелас

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щоб придушити заголовки
Карл Покус

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 насолоджується :)
ryekayo

@WebNash зробив мою відповідь на те, що ви запитали?
ryekayo

0

Наступні роботи для мене на SunOS 5.10.

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

Обидва хвости будуть працювати у фоновому режимі. Зміни у файлах будуть викинуті на stdout. Крім того, ви можете запускати будь-яку команду між ними, просто натискаючи клавішу Enter.


... але це створює два процеси, які потрібно вбити і змішувати STDOUT з вихідним планом.
mpowered

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.