Постепенное чтение файла [дубликат]

Для проверки существующего сеанса tmux (и запуска нового сеанса в фоновом режиме, если такового не существует), используйте

if ! tmux has-session 2>/dev/null; then
    tmux new-session -d
fi

Для проверки сеанса с определенным именем:

if ! tmux has-session -t name 2>/dev/null; then
    tmux new-session -d -s name
fi

В качестве оболочки function:

start_tmux () {
    set -- "${1:-servercontrol}"

    if ! tmux has-session -t "$1" 2>/dev/null; then
        tmux new-session -d -s "$1"
    fi
}

Может использоваться как

$ start_tmux

или

$ start_tmux mysession
0
27.07.2016, 02:59
3 ответа

Вы можете оставить файл открытым:

exec 3< file
cat <&3

sleep 3600

echo After one hour, these records were added:
cat <&3

Это означает, что это должен быть тот же процесс, вызывающий те cat одночасовые апартаменты.


Если в файловой системе включено время доступа, и ваш сценарий - единственное, что читает этот файл, вы также можете прочитать строки, метка времени которых соответствует дате последнего доступа. В системе GNU:

awk -v last_access="$(find file -prune -printf %AFT%AT)" '
   $0 > last_access' < file

Предполагается, что -04: 00 в файле журнала соответствует текущему смещению часового пояса.


Другой подход - записать текущую позицию файла где-нибудь, например, в file.pos :

{
   if [ -e file.pos ]; then
     pos=$(cat file.pos)
   else
     pos=0
   fi
   tail -c +"$((pos+1))"
   perl -le 'print tell STDIN' > file.pos
} < file

Или с ksh93

{
   if [ -e file.pos ]; then
     pos=$(<file.pos)
   else
     pos=0
   fi
   cat <#((pos))
   exec <#((pos=CUR))
   echo "$pos" > file.pos
} < file

Или с zsh :

zmodload zsh/system    
{
   if [ -e file.pos ]; then
     pos=$(<file.pos)
   else
     pos=0
   fi
   sysseek $pos
   cat
   echo "$((systell(0)))" > file.pos
} < file
2
28.01.2020, 02:19
#!/bin/bash

logfile="$1"

test -f "$logfile" || exit 1

lastline="$( basename "$logfile" )-last"

if [ -f "$lastline" ]; then
    place=$( <"$lastline" )
else
    place=1
fi

tmpfile="$( mktemp )"
trap 'rm -f "$tmpfile"' EXIT

sed -n -e "$place,\$p" -e '$=' "$logfile" |
tee "$tmpfile" |
tail -n 1 >"$lastline"

sed '$d' "$tmpfile"

Этот небольшой сценарий возьмет файл журнала в командной строке и покажет все строки в нем, добавленные с момента последнего использования сценария. Он не поддерживает ротацию файлов журнала в его текущей форме , поэтому вам придется вручную удалить файл ...- последний , который он создает в текущем каталоге, если журнал вращается. .

Что он делает:

При первом запуске он использует sed для вывода всех строк заданного файла журнала во временный файл, за которым следует номер последней строки. Этот номер также сохраняется в файле в текущем каталоге с тем же именем, что и файл журнала, с суффиксом -last . Затем временный файл без последней строки, содержащей номер строки, выводится на терминал (если хотите, направьте вывод скрипта в меньше ). Когда сценарий завершает работу, временный файл удаляется.

При повторном запуске номер строки считывается из файла ...- last в текущем каталоге, и содержимое файла журнала обрабатывается с этого номера и до конца аналогичным образом. как прежде.

Если между запусками этого сценария в файл журнала не поступало никаких данных. Будет отображена последняя строка файла журнала.

Запуск:

$ bash script.sh /var/log/system.log
[lots of output]

$ ls system*
system.log-last

$ cat system.log-last
14758

$ bash script.sh /var/log/system.log
[a few lines of output,
 with the first line being the same as the last of the previous run]

$ cat system.log-last
14768
1
28.01.2020, 02:19

Существует утилита командной строки (от 2003 )под названием Re -Tail или «retail», которая выполняет инкрементное чтение файла журнала каждый раз, когда вы запускаете программу в файле журнала.

Это отлично подходит, например, для заданий cron, которые запускаются каждый час.

Re -Tail сохраняет состояние в "офсетном файле"; для каждого файла, в котором вы его запускаете, он будет хранить номер последней строки, а также текст, который был в этом номере строки.

В следующий раз, когда вы запустите программу, она попытается найти сохраненный номер строки и сравнить содержимое. Если есть совпадение, будет выведена остальная часть файла, начиная со следующей строки. Если в файле на диске меньше строк или содержимое строк не совпадает, предполагается, что файл был очищен или повернут, и в этом случае он начнется с первой строки.

Наконец, розничная торговля обновит сохраненный номер строки и содержимое.

Программное обеспечение находится по адресу:http://xjack.org/retail/

Когда я запускаю розничную торговлю с правами root, мне нравится помещать сохраненное состояние в /var/lib/retail. Например, на одной машине я запускаю ритейл каждый час, чтобы составить отчет о входах в систему SSH, используя сценарий, содержащий следующую командную строку:

/usr/local/bin/retail -p /var/lib/retail/ /var/log/secure >"$tempfile"

Удачи!

3
28.01.2020, 02:19

Теги

Похожие вопросы