用reredirect可以实现:https://github.com/jerome-pouiller/reredirect/
基础用法:
reredirect -m FILE PID
然后进程的stdout和stderr都重定向到FILE
了。
如果要把stdout和stderr分别重定向到两个文件:
reredirect -o FILE1 -e FILE2 PID
重定向完成后,会打印一条消息:
# Previous state saved. To restore, use:
reredirect -N -O 5 -E 3 57780
意思应该是原来的stdout的fd变成了5
,原来的stderr的fd变成了3
。而这条命令的作用就是将原来的stdout和stderr都恢复回去。
reredirect甚至对挂在init进程下的孤儿进程都起作用。
这个repo还提供了relink
,可以将进程的输出重定向到当前terminal:
relink PID
同样,relink
对挂载init进程下的孤儿进程也有效。
¶ 特殊情况
- 重定向到的文件被删除
新的文件不会被创建。可以重新跑一遍reredirect
,这样文件会被自动新建,输出也会恢复。
- 重定向到的文件已存在
不知道为什么,当重定向到的文件已存在时,重定向不会成功。这时要把老的文件删掉,然后重新跑一遍reredirect
。
¶ 相关
https://stackoverflow.com/questions/1323956/how-to-redirect-output-of-an-already-running-process
https://superuser.com/questions/76427/how-to-access-stdout-stderr-of-a-detached-process
https://www.baeldung.com/linux/redirect-output-of-running-process
https://blog.csdn.net/weixin_29343349/article/details/116582306