如何重定向已运行进程的输出[重复]
- 2024-10-23 08:47:00
- admin 原创
- 86
问题描述:
通常我会启动如下命令
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/ )进行操作。
下面的命令将进程的输出(标准和错误)重定向PID
到FILE
:
reredirect -m FILE PID
还解释README
了reredirect
其他有趣的特性:如何恢复进程的原始状态,如何重定向到另一个命令或仅重定向 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:
我在网上收集了一些信息,并准备了一个不需要外部工具的脚本:请参阅我的回复。希望对您有所帮助。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件