我有一个运行a命令的应用程序,如下所示:
<command> <switches> >& /dev/null
我可以配置<command>
,但我无法控制<switches>
。此命令生成的所有输出都转到/dev/null
。我希望输出在屏幕上可见或重定向到日志文件。
我尝试使用freopen()
和相关函数将/dev/null
重新打开到另一个文件,但无法使其正常工作。
你还有其他想法吗?这有可能吗?
感谢您的时间。
PS:我在Linux上工作。
答案 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