Добавление нескольких пулов ZFS в LVM

Данные в канале можно прочитать только один раз; часть «что нового» проста. Просто создайте именованный канал с помощью mkfifo, перенаправьте на него свой вывод inotifywait с помощью >и периодически читайте канал.

Более сложная часть — это чтение канала, который где-то открыт для записи без блокировки. дд может это сделать.

Вот установка, которую я использовал для создания и непрерывной записи в канал:

mkfifo foo
( while true ; do date; sleep 1 ; done ) > foo

И прочитать все непрочитанные данные:

dd iflag=nonblock if=foo bs=1M count=1 of=buffer.txt

Вы можете изменить of=...на выходной файл по вашему выбору.

Рано или поздно вы получите неполную строку из конвейера, поэтому убедитесь, что ваш скрипт может с этим справиться. Для того вида деятельности, который вы описываете, хорошим подходом является повторение dd в режиме добавления до тех пор, пока буфер не будет завершен новой строкой -:

buf=buffer.txt
pipe=foo
> $buf # empty the buffer
until [[ $( tail -c1 $buf | od -a ) == *nl* ]] # nl means newline
do
  dd iflag=nonblock oflag=append conv=notrunc if=$pipe bs=1M count=1 of=$buf
  ls -l $buf # see how it grows
  sleep 1 # if the writer dies, this loop will be infinite and we don't want to kill the CPU
done
do_stuff.sh < $buf
# rm $buf

РЕДАКТИРОВАТЬ :Похоже, вы хотите сообщить inotifywait, когда находитесь у терминала, и сбросить все новое. Это проще. Создайте файл типа whatsnew.sh:

#!/bin/bash
echo "waiting for first output... "
while true
do
    n=0
    while read -t0.1 line
    do
        echo "[$line]"
        (( n++ ))
    done
    read -p "$n new lines.  Press any key to try again... " -n1 -s </dev/tty
    echo
done

Затем запустите его:

inotifywait | whatsnew.sh
0
31.03.2020, 02:50
0 ответов

Теги

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