Я ищу то, что, как я подозреваю, не существует: неблокируемый буферизованный именованный канал (fifo) для использования из командной строки. Что-то подобное существует?
Вот пример использования: Предположим, у меня есть процесс, который будет долго работать в фоновом режиме и израсходовать много выходных данных stdout
. Меня не очень волнует вывод, и я не хочу его хранить (возможно, мне не хватает места), но я хотел бы периодически «заходить» и следить за тем, что он делает, а затем снова выбрасывать и оставь это делать свою работу. Поэтому я бы хотел перенаправить вывод в этот теоретически буферизованный неблокирующий именованный канал, а затем периодически подключаться к нему.
В общем, я хочу начать так ( 10M
размер буфера):
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
... и периодически заглядывать, чтобы посмотреть, что происходит ...
tail -f magicfifo
... без magicfifo
сохранения всего вывода (то есть, не обычного файла) и без него, блокирующего процесс выброса, когда он заполняется и не изменяется (так что не совсем обычный именованный канал).
Я не думаю, что решения, включающие tail
или prune
будут делать это (ну, я могу придумать обходной путь tail
), потому tail
что все равно потребовали бы, чтобы я где-то хранил все данные (если я захочу заглянуть и бросить смотреть на это), и prune
должен переписать файл, предположительно (я признаю, что я не пробовал / не доказал это), нарушая перенаправление процесса, генерирующего весь вывод.
Я ожидаю, что мог бы написать какую-нибудь утилиту для этого, но * nix имеет так много классных аспектов файлов и каналов и тому подобное, я просто не могу не думать, что это существует, и я просто не знаю об этом.
Итак: есть ли такая вещь, и если да, то что это?
источник
Ответы:
Я думаю, что вы ищете GNU
screen
. Он поддерживает буфер для полного сохранения последнего экрана или двух выходных данных одной или нескольких программ и позволяет вам отключиться и вернуться позже.источник
tmux
иdtach
- все в одном и том же классе терминального мультиплексора / приложения диспетчера сеансов должно быть в состоянии достигнуть того же самого.Вы можете использовать
pv
, это обеспечивает столько буферизации, сколько вы хотите в конвейере. Вы можете использовать это так:Это даст вам до 1 ГБ буферизации между
spewingprocess
и fifo. Большинство дистрибутивов Linux предлагаютpv
в пакете под названием, хотите верьте, хотите нетpv
.источник
У меня такая же проблема. Это мое первое решение. Сначала запишите выходные данные в файл, который мы усекаем после каждой строки, чтобы он не рос бесконечно:
Затем прочитайте из файла, используя tail (где
2> /dev/null
избавляется от сообщения об ошибке «file truncated»):Таким образом, буфер не растет, и мы можем мультиплексировать, например, запускать столько хвостов, сколько захотим. Однако проблема этого подхода заключается в том, что мы можем потерять данные, когда усечем их быстрее, чем может прочитать хвост, как показывает этот тест:
После запуска в течение некоторого времени первая и последняя строки:
Но в файле меньше строк, поэтому некоторые теряются:
Тем не менее, это кажется хорошим решением, если вы не очень заботитесь о потере данных или когда ваш процесс выброса недостаточно быстр для потери данных.
источник