menu

秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

如何将linux系统中正在运行的进程的输出重定向到一个文件?

from: http://blog.jianingy.com/

如何把一个正在运行中的程序放到后台去执行?
由于事先没有重定向输出到文件或者忘记使用screen、nohup一类的命令,然后进程又不方便停止,而且程序还有可能不会忽略所有挂断(SIGHUP)信号。

这时可以采用如下办法:
1、获得程序的进程号(PID)
2、使用gdb调试这个进程。(gdb -p xxx)
3、通过close系统调用关闭标准输出(STDOUT)或者标准错误(STDERR)
4、通过creat系统调用打开一个文件并将其文件描述符通过dup2系统调用复制给标准输出或者标准错误
5、退出调试器。
现在可以将程序通过“CTRL+z”, “bg”, “disown“放入后台运行了。

详细操作步骤如下
user:~ $ ps awux | grep [t]op
user 4753 0.1 0.0 2308 1008 pts/2 S+ 17:44 0:00 top -b
user:~ $ gdb -p 4753
GNU gdb (GDB) 7.0
...
0xb776a424 in __kernel_vsyscall ()
(gdb) call close(1)
$1 = 0
(gdb) call dup2(creat(”/tmp/log”, 0600), 1)
$2 = 1
(gdb) quit

参考文献
1、http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-pr…

附:让程序在后台运行的几个简单方法
from:http://blog.jianingy.com/
screen
user:~$ screen cvs up
然后直接退出终端即可。如果登录还想看看执行情况可以使用
user:~$ screen -R

nohup
user:~$ nohup cvs up
程序的标准输出会被定向到一个叫nohup.out的文件去

disown
用于已经在运行的程序,先通过CTRL+Z暂停程序然后用bg命令把程序放到后台执行。最后用disown命令让程序与shell脱离关系,这样退出shell后程序还能继续运行。

第一条很不错,学习了

搞定了~~感谢!