Я не уверен, какую терминологию здесь использовать, так что отнеситесь ко мне с пониманием.
Я пишу приложение, которое производитмногожурналов. Я подумал, что было бы здорово, если бы мое приложение могло передавать журналы в поток foo
и разрешать другим процессам читать из него, foo
как будто это поток (вроде /dev/random
).
То есть я хотел бы просто непрерывно передавать журналы куда-то (не беспокоясь о таких вещах файловой системы, как архивация, удаление и т. д.), и иметь возможность для других процессов «подключаться» к этому потоку, как если бы это был какой-то бесконечный файл.
Как мне это сделать? Что такое foo
?
В идеале:
terminal 1
> mkthing foo
> while :; do echo 'abcdefg' >> foo; sleep 1; done
terminal 2
> echo foo
(outputs "abcdefg" every second)
решение1
Абсолютно нормальный способ просмотра журналов — этозапишите их в файл. Когда вы хотите увидеть логи, прочитайте файл. Чтобы посмотреть строки, которые добавляются в файл, используйте команду, напримерtail -f
, который, достигнув конца файла, держит его открытым и следит за дополнительными строками, которые к нему добавляются. Опция -f
предназначена для «следовать», и вменьшевы можете получить тот же эффект с помощью F
for ”follow“; в других программах это может быть известно как “следование” за файлом, потому что tail
это классическая утилита, которая делает это. Смотритетег tail
на этом сайтедля получения дополнительной информации о хвостохранилищах.
Если вы совершенно не хотите записывать логи в файл, вы можете запустить приложение вэкранилиtmux. Для работы /usr/bin/my_application --some-option
в фоновом режиме с экраном:
screen -S myapp -d -m /usr/bin/my_application --some-option
Чтобы просмотреть журналы:
screen -S myapp -d -r
Нажмите Ctrl+ A d, чтобы отсоединиться, т. е. прекратить просмотр журналов. Во время просмотра журналов вы также можете отправлять входные данные в приложение, которые могут быть желательными или нежелательными. Чтобы предоставить только доступ только для чтения, см.Есть ли способ запустить «screen» в режиме только для чтения?
Чтобы запустить приложение с помощью tmux:
tmux new-session -s myapp -d /usr/bin/my_application --some-option
Чтобы просмотреть последние журналы:
tmux attach -r -t myapp
Нажмите Ctrl+, A dчтобы отсоединиться. Запустите tmux attach
без -r
, чтобы иметь возможность взаимодействовать с приложением.
Аименованный каналэто не то, что вы хотите. Я просто упоминаю это, потому что на первый взгляд это выглядит уместно (и пока я пишу, это всплывает в комментариях). Это сделает то, что вы описываете:
mkfifo foo
while :; do echo 'abcdefg' >> foo; sleep 1; done
параллельно с
cat foo
Это не то, что вам нужно, потому что должен быть ровно один читатель. Если читателя нет, то пишущая сторона заблокируется. Если читателей несколько, то каждая строка (или фрагмент, в зависимости от того, как программа выдает вывод) будет видна ровно одному читателю, выбранному более или менее случайным образом. Если читатель есть и он исчезает, то пишущая сторона не сможет записать и получит SIGPIPE, если она их не отключила.