我有一个进程在嵌入式系统(linux)上运行。其STDOUT/STDERR是位于串行端口上的控制台。
我想将它的输出(标准和错误)重定向到SSH会话的输出。我已经读到您可以使用GDB执行类似的操作,但我不知道如何重定向到SSH会话的STDOUT/STDERR,而不是重定向到文件。
由于磁盘资源不足,我无法对文件执行此操作。我也看到了一些使用命名管道的例子,但我没有mkfifo命令。我确实有GDB。
此外,假设这是可能的,当我关闭SSH会话时,进程会终止吗?如果是,我可以在重定向之前重定向回来吗?
谢谢。
只要可以从gdb调用libc函数,就可以执行此操作。
#ssh root@embedded
查询后台程序输出位置:
# ls -l /proc/`pidof daemon`/fd/1
/proc/13202/fd/1 -> /dev/null
它不能为null,它可以指向其他控制台,甚至指向某个管道或文件,将此位置存储在某个地方。查询ssh会话输出位置:
# ls /proc/self/fd/1 -l
lrwx------ 1 root root 64 дек. 15 16:51 /proc/self/fd/1 -> /dev/pts/9
或者,如果你有,只需拨打tty
。
现在开始工作:
# gdb -p `pidof daemon`
..
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call open("/dev/pts/9",2,0)
$1 = 0x3
(gdb) call dup2(3,2)
$2 = 0x2
(gdb) call dup2(3,1)
$3 = 0x1
(gdb) quit
Detaching from program: /root/daemon, process 13202
daemon output/errorput
在退出ssh会话之前重复相同的步骤,只需将/dev/pts/9
替换为open
系统调用中的初始输出位置。