我不确定这里使用什么术语,所以请耐心等待。
我正在编写一个产生的应用程序很多日志。我认为能够让我的应用程序将日志流式传输到,并允许其他进程像流一样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
你可以用“follow”达到同样的效果;在其他程序中,这可能被称为“拖尾”文件,因为tail
这是执行此操作的经典实用程序。看tail
该网站上的标签有关尾矿公用事业的更多信息。
如果您绝对不想将日志写入文件,您可以在以下位置运行应用程序屏幕或者多路复用器。要/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分离,即停止查看日志。当您查看日志时,您还可以将输入发送到应用程序,这可能是理想的,也可能是不需要的。要仅授予只读访问权限,请参阅有没有办法以只读模式运行“屏幕”?
使用 tmux,启动应用程序:
tmux new-session -s myapp -d /usr/bin/my_application --some-option
查看最新日志:
tmux attach -r -t myapp
按Ctrl+A d分离。运行时tmux attach
无法-r
与应用程序交互。
A命名管道不是你想要的。我只是提到它,因为它表面上看起来很合适(当我写它时,它会出现在评论中)。它将执行您所描述的操作:
mkfifo foo
while :; do echo 'abcdefg' >> foo; sleep 1; done
并行于
cat foo
这不是您想要的,因为必须只有一个读者。如果没有读取器,写入端就会阻塞。如果有多个读取器,则每一行(或块,取决于程序如何生成输出)将被恰好一个读取器看到,或多或少是随机选择的。如果有一个读取器并且它消失了,那么写入端将无法写入,并且如果没有禁用它们,则会收到 SIGPIPE。