【问题标题】:Pipe tail output to bash script currently running管道尾部输出到当前运行的 bash 脚本
【发布时间】:2015-04-15 19:49:38
【问题描述】:

所以我有一个脚本可以启动服务并跟踪日志文件,直到服务最终初始化。我使用以下方法来实现这一点: Linux: Block until a string is matched in a file ("tail + grep with blocking")

现在,我希望我的用户在拖尾开始时看到拖尾文件的输出,以便他们跟踪服务的进度。我知道这方面的几种方法,例如生成一个新窗口并将所有尾部输出管道传输到新句柄。这仅在用户位于实际工作站但脚本通过 SSH 远程交互时才有效。所以这在我的情况下不起作用。

我希望这里有人知道如何将尾部传送到正在运行的窗口,同时将尾部文件的输出保持在一行。我想避免将所有输出都发送到脚本屏幕。

如果我太含糊,请告诉我。我可以发布一个屏幕截图来帮助更好地解释我想要实现的目标。

谢谢

【问题讨论】:

  • 您使用了哪个答案?当您说“将尾部通过管道传输到正在运行的窗口,同时将尾部文件的输出保持在一行”时,您是希望显示整个日志还是只显示您正在搜索的行?
  • @EtanReisner 第一个答案。 grep -q 'PATTERN' <(tail -f file.log)。并希望将整个日志通过管道传输到执行脚本的窗口,但我希望我们可以将其截断为一行,而不是喷出所有输出。我希望我知道正确的术语,我相信这可能会帮助您更好地理解我的要求。
  • 这是我不明白的部分。您希望如何在一行中显示整个日志文件?你的意思是你想要一行在日志中出现新行时不断更新?像“状态行”?
  • @EtanReisner 对此表示欢迎。这正是我正在寻找的。​​span>
  • 类似的东西可能会工作,但对于终端我可能会使用 terminfo 序列而不是原始的回车。在运行 tail 之前,您必须使用重复的文件描述符我认为这样做,虽然我可能会解决这个问题,但这些东西总是让我感到困惑并且花费的时间比我想象的要长,所以我可能不是最好的人提供帮助。

标签: linux bash shell


【解决方案1】:

我不确定我是否清楚地满足了您的所有要求,ssh 是 100% 的必需品吗?

这是你*可以做到的一种方式:

#if grep command succeeds then enter infinite loop to repeatedly post to netcat server for remote processing
if (grep -q 'PATTERN'); then
  while :
      tail -n 1 | nc -l 3333

您可以通过以下方式连接到它:

nc <you_other_server's_ip> 3333

【讨论】:

  • 你每行产生 1 个尾进程......这不应该吗? (我现在不能尝试):{grep -q 'PATTERN' && tail -f ;} | nc -l 3333
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多