2015-02-03 5 views
2

주어진 프로세스 (stdin/stdout/stderr)를 간단한 방법으로 리디렉션/볼 수있는 방법이 있습니까? 실행중인 프로세스의 stdin/stdout/stderr보기 - Linux 커널

나는 시도 다음 ('pid는'실행중인 사용자 프로세스가 포함되어 있다고 가정) : '

int foo(const void* data, struct file* file, unsigned fd) 
{ 
    printf("Fd = %x\n", fd); 
    return 0; 
} 
struct task_struct* task = pid_task(find_vpid(pid), PIDTYPE_PID); 
struct files_struct* fs = task->files; 
iterate_fd(fs, 0, foo, NULL); 

내가 foo는 3 전화를받을 (이 과정은 아마 3는 의미가 파일을 열었습니다)하지만 난 수를 파일 포인터에서 실제로 읽지 않습니다.

그것은 인쇄 :

0 
1 
2 

그것이 내가 아주 간단한 방법으로 요청 무엇을 달성 할 수 있습니까? 당신이 당신의 아키텍처로 변경할 수있는 경우

답변

2

먼저

덕분에, 당신은 당신의 인생을 더 쉽게 만들 것 화면, TMUX, nohup을, 또는 dtach 같은 아래를 실행합니다.

그러나 실행중인 프로그램이있는 경우 strace을 사용하여 모든 읽기/쓰기를 포함하여 커널 호출을 모니터링 할 수 있습니다. 보고자하는 것을 제한해야합니다 (시도 -e). 첫 번째 3 개의 FD에 대해서만 출력을 필터링하십시오. 또한 기본값은 기록되는 데이터의 크기를 제한하기 때문에 -s을 추가하십시오. 뭔가 같은 : strace -p <PID> -e read,write -s 1000000

1

당신은) 파일이 과정을 (처리 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 

새 파일을 제공 출력 할 이름 - process_log

(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 

: 그 후 10

는 결과를 확인합니다.

관련 문제