将进程输出重定向到/dev/null,如何撤销重定向?

3

我已经将几个进程推到后台,并将输出重定向到 /dev/null。现在我想要撤销这个操作并查看它在后台运行了很长时间之后发生了什么。

有没有一种方法可以撤销 > /dev/null 重定向并将该进程切换到前台?


程序已经启动后,除非您修改该程序的源代码以显式添加该功能,否则修复起来会更加困难,但是您始终可以使用诸如sysdig或(性能惩罚要大得多的)strace之类的工具来交互式地观察写入/dev/null的内容;特别是sysdig具有一个“凿子”(用lua编写的辅助脚本),可以将内容重新组装成类似于尾随stdout的东西。 - Charles Duffy
就交互使用而言,而非编写一个可以在重定向部分撤销的脚本,我认为它属于 [unix.se]。(关于主题的变体已经在这里问答过了,例如 如何在 bash 中撤销 exec >/dev/null - Charles Duffy
1个回答

1
我认为你的问题最好发布在unix上。
在那里,你可以找到如何更改正在运行进程的输出重定向?,它以更一般的形式表示了你的问题。
从答案和第三方工具(redirect)中,我推断出没有仅使用shell就能实现你想要的方法。
然而,那个问题是来自2012年,所以你可能想问一个新的问题,看看是否有什么变化。
最后但并非最不重要的是,在man bash中进行一些搜索,我找到了Coprocesses部分,它的内容如下:
[…] A coprocess is executed asynchronously in a subshell, as if the command had been
terminated with the & control operator, with a two-way pipe established between
the executing shell and the coprocess. […] The standard output of command is
connected via a pipe to a file descriptor in the executing shell, and that
file descriptor is assigned to NAME[0]. The standard input […]

如果我正确理解引用的话,这可能是在不失去更改进程文件描述符的能力的情况下启动后台进程的一种方式。


使用协处理器并不能为您带来任何通过将标准输入和输出连接到命名FIFOs也可以获得的东西。我不确定这是OP在这里问题的有意义的解决方案。 - Charles Duffy
毕竟,如果有人事先知道他们想要做这件事,他们也可以将其管道传输到类似于 while IFS= read -r line; if (( trash )); then :; else printf '%s\n'; fi; done 的东西,并设置一个陷阱以接受 SIGUSR1 信号并切换 trash 是否为真。有很多解决方案,但使得这个问题与现有的主题不同的是,他们试图在没有事先设置好知道他们会改变输出位置的情况下修复他们犯的错误。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接