在 Linux 上,一个进程如何拦截另一个进程的 stdout 和 stderr?

2024-10-28 08:37:00
admin
原创
229
摘要:问题描述:我有一些脚本本应停止运行但却一直挂起。有什么方法可以让我以可读的方式找出它们写入 STDOUT 和 STDERR 的内容吗?例如,我尝试过这样做:$ tail -f /proc/(pid)/fd/1 但实际上这行不通。无论如何,这都是一个冒险。还有其他想法吗?strace就其本身而言,这是相当冗长和...

问题描述:

我有一些脚本本应停止运行但却一直挂起。有什么方法可以让我以可读的方式找出它们写入 STDOUT 和 STDERR 的内容吗?

例如,我尝试过这样做:

$ tail -f /proc/(pid)/fd/1

但实际上这行不通。无论如何,这都是一个冒险。

还有其他想法吗?

strace就其本身而言,这是相当冗长和难以理解的。

注意:我只对它们的输出感兴趣,对其他任何事情都不感兴趣。我有能力自己弄清楚其他事情;这个问题只关注在启动正在运行的进程如何访问它的 stdout 和 stderr。


解决方案 1:

由于我无权编辑 Jauco 的答案,因此我将提供对我有用的完整答案(Russell 的页面依赖于不保证的行为,即,如果关闭 STDOUT 的文件描述符 1,则下一个creat调用将打开 FD 1。

因此,运行一个简单的无限脚本,如下所示:

import time

while True:
    print 'test'
    time.sleep(1)

保存为 test.py,运行

$ python test.py

获取 PID:

$ ps auxw | grep test.py

现在,附上gdb

$ gdb -p (pid)

然后施展fd魔法:

(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1

现在您可以tail /tmp/stdout看到以前发送到 STDOUT 的输出。

解决方案 2:

有几种新的实用程序可以整合“gdb 方法”并添加一些额外的功能。我现在使用的一个实用程序称为“reptyr”(“Re-PTY-er”)。除了抓取 STDERR/STDOUT 之外,它实际上还会更改进程的控制终端(即使它之前没有连接到终端)。

它的最佳用途是启动一个屏幕会话,并使用它将正在运行的进程重新连接到屏幕内的终端,以便您可以安全地脱离它并稍后再回来。

它被打包在流行的发行版中(例如:“apt-get install reptyr”)。

http://onethingwell.org/post/2924103615/reptyr

解决方案 3:

GDB 方法似乎更好,但您也可以使用strace

$ strace -p <PID> -e write=1 -s 1024 -o file

通过手册页strace

   -e write=set
               Perform a full hexadecimal and ASCII dump of all the
               data written to file descriptors listed in the spec-
               ified  set.  For example, to see all output activity
               on file descriptors 3 and 5 use -e write=3,5.   Note
               that  this is independent from the normal tracing of
               the write(2) system call which is controlled by  the
               option -e trace=write.

这会打印出比您需要的多一些的内容(十六进制部分),但您可以sed轻松地将其打印出来。

解决方案 4:

我不确定它是否适合你,但我之前读过一页,描述了一种使用 gdb 的方法

解决方案 5:

我使用 strace 并将十六进制输出解码为明文:

PID=some_process_id
sudo strace -f -e trace=write -e verbose=none -e write=1,2 -q -p $PID -o "| grep '^ |' | cut -c11-60 | sed -e 's/ //g' | xxd -r -p"

我从其他答案中组合了这个命令。

解决方案 6:

strace`-ewrite只使用(而不是后缀)输出会少很多=1`。在我看来,它比 GDB 方法要简单一些。

我用它来查看现有 MythTV 编码作业的进度(sudo因为我并不负责编码过程):

$ ps -aef | grep -i handbrake
mythtv   25089 25085 99 16:01 ?        00:53:43 /usr/bin/HandBrakeCLI -i /var/lib/mythtv/recordings/1061_20111230122900.mpg -o /var/lib/mythtv/recordings/1061_20111230122900.mp4 -e x264 -b 1500 -E faac -B 256 -R 48 -w 720
jward    25293 20229  0 16:30 pts/1    00:00:00 grep --color=auto -i handbr

$ sudo strace -ewrite -p 25089
Process 25089 attached - interrupt to quit
write(1, "
Encoding: task 1 of 1, 70.75 % "..., 73) = 73
write(1, "
Encoding: task 1 of 1, 70.76 % "..., 73) = 73
write(1, "
Encoding: task 1 of 1, 70.77 % "..., 73) = 73
write(1, "
Encoding: task 1 of 1, 70.78 % "..., 73) = 73^C

解决方案 7:

您可以使用 reredirect(https://github.com/jerome-pouiller/reredirect/)。

类型

reredirect -m FILE PID

并且输出(标准和错误)将写入文件中。

reredirectREADME还解释了如何恢复进程的原始状态,如何重定向到另一个命令或仅重定向 stdout 或 stderr。

解决方案 8:

您没有说明您的操作系统,但我尝试说“Linux”。

查看写入 stderr 和 stdout 的内容可能没什么用。如果有用的话,您可以在启动脚本之前使用 tee(1) 复制 stderr 和 stdout。

您可以使用 ps(1) 查找 wchan。这会告诉您进程正在等待什么。如果您查看 strace 输出,则可以忽略大部分输出并识别最后一个(被阻止的)系统调用。如果它是对文件句柄的操作,您可以在输出中向后追溯并识别底层对象(文件、套接字、管道等)。从那里答案可能很清楚。

您还可以向进程发送一个信号,使其转储核心,然后使用调试器和核心文件来获取堆栈跟踪。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用