如何重定向已运行进程的输出[重复]

2024-10-23 08:47:00
admin
原创
288
摘要:问题描述:通常我会启动如下命令longcommand &; 我知道你可以通过执行以下操作来重定向它longcommand > /dev/null; 例如摆脱输出或longcommand 2>&1 > output.log 捕获输出。但我有时会忘记,并且想知道是...

问题描述:

通常我会启动如下命令

longcommand &;

我知道你可以通过执行以下操作来重定向它

longcommand > /dev/null;

例如摆脱输出或

longcommand 2>&1 > output.log

捕获输出。

但我有时会忘记,并且想知道是否有办法在事后捕获或重定向。

longcommand
ctrl-z
bg 2>&1 > /dev/null

或类似的东西,这样我就可以继续使用终端,而不会在终端上弹出消息。


解决方案 1:

请参阅重定向正在运行的进程的输出

首先,我在一个会话中运行该命令cat > foo1,并测试来自 stdin 的数据是否已复制到文件中。然后在另一个会话中,我重定向输出。

首先找到进程的PID:

$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

现在检查它打开的文件句柄:

$ ls -l /proc/6760/fd
total 3
lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1
lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5

现在运行GDB:

$ gdb -p 6760 /bin/cat
GNU gdb 6.4.90-debian

[license stuff snipped]

Attaching to program: /bin/cat, process 6760

[snip other stuff that's not interesting now]

(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/foo3", 0600)
$2 = 1
(gdb) q
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/cat, process 6760

GDB 中的命令p将打印表达式的值,表达式可以是要调用的函数,也可以是系统调用……因此,我执行close()系统调用并传递文件句柄 1,然后执行creat()系统调用以打开新文件。结果是creat()1,这意味着它替换了以前的文件句柄。如果我想对 stdout 和 stderr 使用同一个文件,或者如果我想用其他数字替换文件句柄,那么我需要调用系统dup2()调用来实现该结果。

对于此示例,我选择使用creat()而不是,open()因为参数较少。标志的 C 宏在 GDB 中不可用(它不使用 C 标头),因此我必须阅读标头文件才能发现这一点——这样做并不难,但需要更多时间。请注意,0600 是所有者具有读/写访问权限而组和其他人无权访问的八进制权限。使用 0 作为该参数并在稍后对文件运行 chmod 也是可行的。

之后我验证了结果:

ls -l /proc/6760/fd/
total 3
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5

输入更多数据cat将导致文件/tmp/foo3被附加到其中。

如果要关闭原始会话,则需要关闭它的所有文件句柄,打开一个可以作为控制 tty 的新设备,然后调用setsid()

解决方案 2:

reredirect您也可以使用(https://github.com/jerome-pouiller/reredirect/ )进行操作。

下面的命令将进程的输出(标准和错误)重定向PIDFILE

reredirect -m FILE PID

还解释READMEreredirect其他有趣的特性:如何恢复进程的原始状态,如何重定向到另一个命令或仅重定向 stdout 或 stderr。

该工具还提供了relink一个允许将输出重定向到当前终端的脚本:

relink PID
relink PID | grep usefull_content

reredirect似乎具有与另一个答案中描述的 Dupx 相同的功能,但它不依赖于 Gdb)。

解决方案 3:

杜普克斯

Dupx 是一个简单的 *nix 实用程序,用于重定向已运行进程的标准输出/输入/错误。

动机

我经常会遇到这种情况:通过 SSH 在远程系统上启动的进程花费的时间比我预期的要长得多。我需要断开 SSH 连接,但如果我这样做,如果进程试图在 stdout 上写入内容/管道损坏导致错误,它就会死机。我希望我可以用 ^Z 暂停该进程,然后执行

bg %1 >/tmp/stdout 2>/tmp/stderr 

不幸的是,这不起作用(在我知道的 shell 中)。

http://www.isi.edu/~yuri/dupx/

解决方案 4:

屏幕

如果进程在屏幕会话中运行,您可以使用屏幕的日志命令将该窗口的输出记录到文件中:

切换到脚本窗口,C-a H进行记录。

现在您可以:

$ tail -f screenlog.2 | grep whatever

来自屏幕的手册页:

记录 [开|关]

开始/停止将当前窗口的输出写入窗口默认目录中的文件“screenlog.n”,其中 n 是当前窗口的编号。可以使用“logfile”命令更改此文件名。如果没有给出参数,则切换日志记录状态。如果文件已存在,则会话日志将附加到文件的先前内容中。当前内容和回滚历史记录的内容不包含在会话日志中。默认为“关闭”。

我确信 tmux 也有类似的东西。

解决方案 5:

我在网上收集了一些信息,并准备了一个不需要外部工具的脚本:请参阅我的回复。希望对您有所帮助。

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用