加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 综合聚焦 > Linux > 正文

linux – 登录FIFO,然后重定向到文件?

发布时间:2020-07-16 09:49:09 所属栏目:Linux 来源:互联网
导读:我有一个必须记录每个事务的应用程序.每个日志消息都被刷新,因为我们需要记录导致崩溃的情况.我和我的同事很好奇如何在保证日志消息离开过程的同时实现缓冲的性能效果. 我们想出的是: 创建应用程序可以写入的FIFO,以及 通过cat将该FIFO的内容重定向到常规文

我有一个必须记录每个事务的应用程序.每个日志消息都被刷新,因为我们需要记录导致崩溃的情况.我和我的同事很好奇如何在保证日志消息离开过程的同时实现缓冲的性能效果.

我们想出的是:

>创建应用程序可以写入的FIFO,以及
>通过cat将该FIFO的内容重定向到常规文件.

也就是说,通常是:

app --logfile logfile.txt

就是现在:

mkfifo logfifo
cat logfifo &> logfile.txt &
app --logfile logfifo

这种方法有什么问题吗?它在我们测试它时起作用,但是我们想要确保即使原始应用程序崩溃,消息也会找到重定向文件的路径.

(我们没有应用程序的源代码,因此编程解决方案是不可能的.此外,应用程序不会写入stdout,因此直接使用不同的命令是不可能的.所以syslog不是一个潜在可能.)

更新:我添加了赏金.接受的答案将不涉及记录器,原因很简单,记录器不是我所询问的.正如最初的问题所述,我只是在寻找使用FIFO的问题.

解决方法

请注意,在编程中通常需要fifo,其中写入的数量可以超过读出的数量.

因为这样一个fifo不会像你预期的那样完全顺利地工作,但会在引入另一个时解决你的主要问题.

有三个可能的警告.

>如果在初始化时没有读取另一端,则无限期地阻止写入fifo.
> fifo具有64K的固定宽度,如果缓冲区被该点填充,则进一步写入将被阻塞,直到读者已经赶上.
>如果读者死亡或退出,管道编写者将被SIGPIPE杀死.

这将意味着您的问题(在非缓冲写入上模拟缓冲I / O)将得到解决.这是因为你的FIFO上的新“限制”实际上将变成任何实用程序正在写入管道中的内容(可能是缓冲的I / O)的速度.

然而,作者依赖于您的日志阅读器来运行.如果读者突然停止阅读,则作者将阻止.如果读者突然退出(假设您的目标上的磁盘空间不足),编写者将会SIGPIPE并可能退出.

另一点需要提及的是,如果服务器发生混乱并且内核停止响应,则可能会丢失该缓冲区中最多64k的数据.

解决这个问题的另一种方法是将日志写入tmpfs(linux上的/ dev / shm)并将输出拖到固定的磁盘位置.这样做的内存分配限制较少(不是64K,通常是2G!),但如果编写器没有动态方式重新打开日志文件(可能需要定期清理tmpfs中的日志),则可能对你不起作用.如果服务器在此方法中发生混乱,则可能会丢失更多数据.

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读