Можно ли создать пользовательский поток?

Можно ли создать пользовательский поток?

Я не уверен, какую терминологию здесь использовать, так что отнеситесь ко мне с пониманием.

Я пишу приложение, которое производитмногожурналов. Я подумал, что было бы здорово, если бы мое приложение могло передавать журналы в поток 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предназначена для «следовать», и вменьшевы можете получить тот же эффект с помощью Ffor ”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, если она их не отключила.

Связанный контент