相关疑难解决方法(0)

从命名管道(cat 或 tail -f)连续读取

我已配置rsyslog将某些日志事件记录到/dev/xconsole

*.*;cron.!=info;mail.!=info      |/dev/xconsole
Run Code Online (Sandbox Code Playgroud)

/dev/xconsole是一个命名管道 ( fifo)。如果我想查看正在记录的内容,我可以做cat /dev/xconsole. 我很惊讶地看到,该命令cat /dev/xconsole在读取文件后并未完成,而是充当tail -f. 换句话说,这两个命令的行为相同:

cat /dev/xconsole
tail -f /dev/xconsole
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这是为什么吗?

两者之间有什么区别吗?

pipe tail cat fifo

20
推荐指数
1
解决办法
6万
查看次数

是否可以在命名管道上进行 seek() 操作返回成功?

有什么方法可以使当程序尝试seek()在命名管道上执行操作时它会成功返回(但就像管道是一个空文件一样)而不是“非法搜索”?

我的系统上的最后一点点日志都存储在 SQLite 数据库中,我在任何地方都没有文件。但是,有一些程序会遇到此问题。具体有2种情况;

  • 一个程序想要写入一个日志文件,syslog-ng 已将其创建为命名管道并从中读取。程序seek()出于某种原因想要执行 a然后失败。
  • 程序(例如 denyhosts 或 fail2ban)想要从 syslog-ng 创建为命名管道并正在写入的日志文件中读取。该程序想要对其执行 aseek()并失败。

理想情况下,我只是喜欢这些试图表现得好像命名管道只是一个空文件。我看不出写日志的程序无论如何都需要执行查找的任何原因,它应该只打开文件进行追加并开始写入。我可以理解为什么程序阅读会想要寻找,以便它可以从最后一个位置恢复,所以我希望它表现得好像文件是空的(就像它被截断了一样)。

那么是否可以在命名管道上设置一些选项来让它们以这种方式运行?如果没有,当 syslog-ng 打开管道时是否可以设置一种模式,让它以这种方式运行(我愿意进行代码更改)?还是我在一条小溪上?

pipe syslog

12
推荐指数
1
解决办法
6269
查看次数

有没有办法在不停止管道中的其他进程的情况下退出“较少”跟随模式?

很多时候,我发现自己需要将输出保存在具有所有功能(滚动、搜索、快捷方式等)的缓冲区中,而且我已经习惯了less.

但是,我使用的大多数命令都会连续生成输出。less与连续输出一起使用并不能真正按我预期的方式工作。

例如:

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | less -R
Run Code Online (Sandbox Code Playgroud)

这会导致less捕获输出,直到它达到最大终端高度,此时一切都停止(希望仍然接受数据),允许我使用移动键上下滚动。这是想要的效果。

奇怪的是,当我赶上生成的内容(通常是PgDn)时,它会导致less锁定并跟随新数据,直到我终止^C并停止原始命令为止,不允许我使用移动键。这不是想要的效果。

我使用less不正确吗?有没有其他程序可以满足我的愿望?是否可以从此模式“解锁”?

谢谢!

shell less pipe signals job-control

10
推荐指数
2
解决办法
6182
查看次数

标签 统计

pipe ×3

cat ×1

fifo ×1

job-control ×1

less ×1

shell ×1

signals ×1

syslog ×1

tail ×1