【问题标题】:Is there a way to get an output from already running program?有没有办法从已经运行的程序中获取输出?
【发布时间】:2025-12-15 15:25:06
【问题描述】:

我正在尝试编写一个以rtmpsrv 开头并等待它的一些输出的脚本。 rtmpsrv 提供所需的输出并继续运行,但脚本正在等待 rtmpsrv 的终止。如何在不停止的情况下访问rtmpsrv 的输出?

【问题讨论】:

  • 请给我们看看你的剧本好吗?
  • @Ube,没有什么可显示的。可能类似于a=$(rtmpsrv); while true; do #do something with a
  • 你能更准确地说出你想要什么吗?您是否只想阅读原本正在运行的进程的前几行? 任何几行?你能负担得起记录所有输出的磁盘空间,还是需要在捕获后丢弃内容?
  • 另外,你说“已经在运行”——意味着进程在你的脚本之前启动——但是在你的文本中你指出这个相同的脚本是启动进程的。这些是非常不同的事情。
  • @CharlesDuffy, rtmpsrv 返回一行包含rtmpdump,它是这个脚本的目标。我可以使用磁盘空间。

标签: linux bash


【解决方案1】:

好吧,我不熟悉rtmpsrv,但除非必要,否则您应该等待它完成。但是,您可以将其输出重定向到一个文件,然后grep 该文件以查看它是否包含您要查找的字符串。

(虚构的代码......你可以期待语法地狱,只是想给你一个想法)

nohup rtmpsrv >log.rtmpsrv 2>&1 &
...
while :; do
    if ! result=$(grep "your desired line" log.rtmpsrv); then
        echo "success: found $result"
        break
    fi
done

注意:if 结构应该按照http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html 工作——只是为了有更好的代码,正如@Charles Duffy 建议的那样。

【讨论】:

  • 谢谢。我尝试将输出写入文件并尝试使用 & 运行,但单独运行。
  • value=$(grep "your desired line" log.rtmpsvr) && break 会更简洁。 if value=$(grep ...) 相同;然后 ...; fi. Generally, checking $?` 为零被视为反模式。
  • @Charles Duffy 现在看起来更好了吗?如果没有,请随时编辑我的答案 - 我们都可以从中受益:)
  • 进行了一些调整,并演示了输出捕获。外部if 不是必需的,因为重定向是在程序启动之前执行的,即使该程序在后台运行,所以当我们到达时我们不需要担心log.rtmpsrv 不存在循环。
  • 顺便说一下,我建议mywiki.wooledge.org/BashGuide 作为更好的参考。 Freenode 的#bash 频道不断地帮助人们改掉他们从 TLDP 的“高级”Bash 脚本指南中养成的坏习惯。
【解决方案2】:

最简单的方法是这样的:

rtmpsrv > logfile &

然后您可以搜索logfile 以查找您要查找的文本。同时,rtmpsrv 会照办,完全不知道您的脚本。

这个问题包含如何在脚本中等待特定模式出现在日志文件中的示例(因此您不必一次又一次地搜索它):Do a tail -F until matching a pattern

注意:如果您在脚本中启动rtmpsrv 进程并且脚本终止,它可能会杀死rtmpsrv 进程。为避免这种情况,请使用nohup

【讨论】:

  • 一般看起来不错。您可能会扩展您的答案,以确保 rtmpsrv 实例能够在其父进程退出后继续存在(并且连接到该父进程的任何终端都将消失)。
【解决方案3】:

只需使用gdb -p <pid> 附加到进程,其中pid 是脚本的进程ID。

你可以通过像这样ps ax | grep <My Script's Name>ps ax | grep <My Script's Name>来找到你运行脚本的pid

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

【讨论】:

  • 参见meta.stackexchange.com/questions/92505/…,得出的结论是仅链接的答案应标记为关闭作为非答案。
  • 啊好的,那我会用一些技术说明更新我的答案,感谢@CharlesDuffy 的说明
  • 所以,这回答了关于一个已经在运行的进程的问题——虽然这就是问题的标题所要问的,但这不是问题的 text 所问的关于;在分离之前只读取前几行并允许其继续运行的程序正在由此处编写的脚本启动,从而允许使用侵入性较小的技术。跨度>
  • 您说得对,问题的标题具有误导性。另外题的文字也不清楚,他到底想要什么,至少他已经选择了他要找的东西。到目前为止,我试图变得有用。
最近更新 更多