bash - 如何重定向已经运行进程的输出

通常我会这样启动命令

 
longcommand &;

我知道通过以下方式可以重定向


longcommand > /dev/null;


longcommand 2>&1 > output.log

捕获输出。

但我有时会忘记。我想知道,在运行命令后是否有捕获或重定向的方法。


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

时间:

首先,在一个会话中运行命令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


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

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

你还可以使用reredirect (https://github.com/jerome-pouiller/reredirect/)来实现。


reredirect -m FILE PID

输出(标准和错误)将写入文件。

reredirect README还说明了如何还原进程的原始状态,如何重定向到另一个命令或仅重定向stdout或stderr。

...