Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请参阅正在运行的进程的stdin/stdout/stderr-Linux内核_Linux_Linux Kernel - Fatal编程技术网

请参阅正在运行的进程的stdin/stdout/stderr-Linux内核

请参阅正在运行的进程的stdin/stdout/stderr-Linux内核,linux,linux-kernel,Linux,Linux Kernel,有没有一种方法可以用一种简单的方式(通过PID)重定向/查看给定运行进程的stdin/stdout/stderr 我尝试了以下操作(假设“pid”包含一个正在运行的用户进程): 我收到了3个对foo的调用(这个过程可能有3个打开的文件,这是有意义的),但我不能真正地从中读取(从文件指针) 它打印: 0 1 2 是否有可能以一种相当简单的方式实现我的要求 谢谢首先,如果你能改变你的架构,你可以在screen、tmux、nohup之类的东西下运行它,或者让你的生活更轻松 但是,如果您有一个正在运行

有没有一种方法可以用一种简单的方式(通过PID)重定向/查看给定运行进程的stdin/stdout/stderr

我尝试了以下操作(假设“pid”包含一个正在运行的用户进程):

我收到了3个对foo的调用(这个过程可能有3个打开的文件,这是有意义的),但我不能真正地从中读取(从文件指针)

它打印:

0
1
2
是否有可能以一种相当简单的方式实现我的要求


谢谢

首先,如果你能改变你的架构,你可以在screen、tmux、nohup之类的东西下运行它,或者让你的生活更轻松


但是,如果您有一个正在运行的程序,您可以使用来监视它的内核调用,包括所有读/写操作。您将需要限制它所看到的内容(尝试
-e
),并可能仅过滤前3个FD的输出。同时添加
-s
,因为默认设置是限制记录的数据大小。类似于:
strace-p-e read,write-s 1000000

您可以通过gdb实现它

检查文件句柄进程()是否已打开:

$ 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 (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
[lots more 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/process_log″, 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/process_log <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
ls-l/proc/6760/fd/
总数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/process_log/dev/pts/5
同样,您也可以重定向stdin和stderr

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/process_log <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5