如何将输出重定向远离/ dev / null

时间:2010-03-24 12:28:28

标签: c redirect stdio

我有一个运行a命令的应用程序,如下所示:

<command> <switches> >& /dev/null

我可以配置<command>,但我无法控制<switches>。此命令生成的所有输出都转到/dev/null。我希望输出在屏幕上可见或重定向到日志文件。

我尝试使用freopen()和相关函数将/dev/null重新打开到另一个文件,但无法使其正常工作。

你还有其他想法吗?这有可能吗?

感谢您的时间。

PS:我在Linux上工作。

12 个答案:

答案 0 :(得分:7)

可怕的黑客:

在二进制模式下使用文本编辑器打开应用程序,找到'/ dev / null /'并用相同长度的字符串替换它

e.g '~/tmp/log'
  • 先备份
  • 小心
  • 非常小心
  • 我提到了备份吗?

答案 1 :(得分:4)

由于您可以修改运行的命令,因此可以使用简单的shell脚本作为包装,将输出重定向到文件。

#!/bin/bash
"$@" >> logfile

如果将其作为capture_output.sh保存在路径中,则可以将capture_output.sh添加到命令的开头,以将程序的输出附加到logfile。

答案 2 :(得分:2)

在命令末尾追加#,使其变为<command> # >& /dev/null,从而注释掉不需要的部分。

答案 3 :(得分:2)

您的应用程序可能正在运行shell并将其传递给该命令行。

您需要让它运行您编写的脚本。该脚本将使用>/dev/null替换命令行中的>>/your/log,并使用修改后的命令行调用真实shell。

第一步是更改应用程序使用的shell。更改环境变量SHELL应该足够了,即以

运行您的应用程序
SHELL=/home/user/bin/myshell theApp

如果这不起作用,请尝试暂时将/bin/sh与您的脚本相关联。

myshell将调用原始shell,但在模式替换参数后:

#!/bin/bash
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"}

这些方面应该有所作为。

答案 4 :(得分:1)

您可以使用gdb对已经运行的进程执行此操作。请参阅以下页面:http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

答案 5 :(得分:1)

您可以为该命令创建别名吗?如果是,则将其别名为另一个将输出转储到文件的命令。

答案 6 :(得分:1)

设备文件/dev/tty引用了应用程序的控制终端 - 如果没有更改,那么这应该有效:

freopen("/dev/tty", "w", stdout);
freopen("/dev/tty", "w", stderr);

或者,您可以重新打开它们以指向日志文件:

freopen("/var/log/myapp.log", "a", stdout);
freopen("/var/log/myapp.err", "a", stderr);

答案 7 :(得分:1)

它可能不完全重定向,但它允许在任何地方获取输出

strace -ewrite -p $PID

这不是那种清晰(显示如下行:写(#,)),但有效! (并且是单行:D)您可能也不喜欢这样的事实,即参数是缩写的。控制使用-s参数来设置显示的字符串的最大长度。

它会捕获所有流,因此您可能希望以某种方式过滤它。

您可以过滤它:

strace -ewrite -p $PID 2>&1 | grep "write(1"

仅显示描述符1调用。 2&gt;&amp; 1是将stderr重定向到stdout,因为strace默认写入stderr。

答案 8 :(得分:0)

编辑:这不是一个好主意,当然不值得尝试,除非你知道这会破坏什么。它适用于我,也可能适合你。

好的,这是一个非常糟糕的黑客,可能不值得做。假设其他任何命令都不起作用,并且您根本无法访问二进制文件/应用程序(包含带/dev/null的命令),并且您无法将输出重定向到其他文件(通过替换{{1 }})。

然后,您可以删除/ dev / null(/dev/null)并在其位置(最好使用软链接)创建您自己的文件,其中可以定向所有数据。完成后,可以使用以下命令再次创建/ dev / null:

$> rm /dev/null

非常清楚,这是一个糟糕的黑客,当然需要 root 权限才能工作。您的重定向文件可能包含正在运行的许多其他应用程序/二进制文件的数据并使用$> mknod -m 666 /dev/null c 1 3作为接收器的可能性很高。

答案 9 :(得分:0)

在perl中,如果您只想将STDOUT重定向到更有用的内容,您可以执行以下操作:

open STDOUT, '>>', '/var/log/myscript.log';
open STDERR, '>>', '/var/log/myscript.err';

在脚本的开头,并且会将其重定向到脚本的其余部分。

答案 10 :(得分:0)

根据e-t172的回答,您可以将最后一个开关设置为(或附加到它):

; echo 

答案 11 :(得分:0)

如果在将内容传递给/ dev / null之前可以输入内联(不确定是否正在处理硬编码命令),可以使用 tee 重定向到您选择的内容。 / p>

维基百科中允许升级命令的示例:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

http://en.wikipedia.org/wiki/Tee_(command)