보기 위해 프로세스 출력에 첨부


110

콘솔 / 터미널 뷰를 애플리케이션 출력에 '연결'하여 무슨 말을하는지 볼 수 있습니까?

애플리케이션을 종료하지 않고 애플리케이션 출력에서 ​​분리하려면 어떻게해야합니까?

일반적으로 명령 줄을 사용하여 대화 형 응용 프로그램을 시작하면 모든 종류의 멋진 출력을 볼 수 있습니다. 그러나 KINO와 같이 특히 수다스러운 프로그래밍이 실행 중이고 명령 줄을 통해 다시 시작하지 않고 주어진 순간에 출력을보고 싶다고 가정 해 보겠습니다. 나는 할 수 없다. 적어도 나는 방법을 모른다.


1
프로세스에 디버그 기호가 있습니까? 프로덕션 환경에서 실행됩니까? 그렇다면 일시 중지되지 않도록해야합니까?
yves Baumes

kino와 같은 최종 사용자 프로그램에서 안정성 문제가 발생했을 때 (내 사운드가 크래시되고 중단됨) 어떻게 / 왜 크래시되었는지 알 수 있으므로 수정 작업을 할 수 있습니다. 이것은 제가 개발중인 프로그램이 아니라 문제 해결을 위해 알고 싶은 기술입니다. 아래에서 제안을 시도해 보겠습니다.
aggitan 2009

답변:


17

여기에는 몇 가지 옵션이 있습니다. 하나는 명령의 출력을 파일로 리디렉션 한 다음 'tail'을 사용하여 해당 파일에 추가 된 새 줄을 실시간으로 보는 것입니다.

또 다른 옵션은 일종의 텍스트 기반 터미널 응용 프로그램 인 '화면'내에서 프로그램을 시작하는 것입니다. 화면 세션은 연결 및 분리가 가능하지만 명목상 동일한 사용자 만 사용하는 것을 의미하므로 사용자간에 공유하려는 경우 엉덩이에 큰 고통이됩니다.


1
"여기에는 몇 가지 옵션이 있습니다. 하나는 명령 출력을 파일로 리디렉션 한 다음 'tail'을 사용하여 해당 파일에 추가 된 새 줄을 실시간으로 보는 것입니다." 이미 실행중인 응용 프로그램으로이 작업을 수행 할 수 있습니까?
aggitan 2009

2
파일에 기록 된대로 출력을 얻으려면 tail -f $ log_file이 필요할 수 있습니다. 또한 아니요, 이미 실행중인 앱으로이를 수행 할 방법이 없습니다.
Varkhan 2009

@aggitan : 아니요. 기존 애플리케이션의 경우 이미 I / O를 제어 터미널에 바인딩했기 때문에 다시 시작해야합니다.
Don Werve


286

여기에 더 간단한 해결책이 있다고 생각합니다. /proc경로에서 액세스 할 수있는 의사 파일 시스템 아래에서 찾고있는 PID와 이름이 일치하는 디렉토리를 찾으십시오 . 따라서 ID가 1199 인 프로그램이 실행 중이면 다음과 같이 입력 cd합니다.

$ cd /proc/1199

그런 다음 fd아래 의 디렉토리를 찾으십시오.

$ cd fd

fd디렉토리에는 프로그램이 사용하는 파일 설명자 객체 (0 : stdin, 1 : stdout, 2 : stderr)가 있으며tail -f 필요한 항목 됩니다 (이 경우에는 stdout).

$ tail -f 1

9
내가 사용 할 수 없습니다 tail출력이 입력에 대한 다른 프로세스로 리디렉션 된 내 경우처럼, 그러나 more나에게 현재 데이터를 보여 주었다.
Ωmega 2013-09-13

10
이 사이트에서 가장 답답한 게시물 중 하나입니다!
로버트

2
more나를 위해 일하고 있습니다. ubuntu 14.04 on a node process
Shih-Min Lee

1
이것은 System.out.println을 호출하는 Java 프로세스에서 작동하지 않습니다. / proc / [pid] / fd / 1에 대한 출력이 전혀 없습니다
Nick

1
아래를 사용하여 복제물을 만들려고했지만 아무 소용이 없습니다 :```docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo 계속 댄스 플로어 비트를 유지하십시오; (( COUNT ++)); sleep 1; echo \ "Count is : \ $ {COUNT} \"; done; " ``다른 단말기에``고정 표시기 간부 - 그것은 container1을 꼬리 -f은 / proc / 1 / FD / 1 '' '
JacobWuzHere

54

나는 이와 똑같은 것을 찾고 있었고 당신이 할 수 있다는 것을 알았습니다.

strace -ewrite -p $PID

정확히 필요한 것은 아니지만 매우 가깝습니다.

리디렉션 출력을 시도했지만 작동하지 않았습니다. 프로세스가 소켓에 쓰고 있었기 때문에 모르겠습니다.


감사합니다. 작동하지만 출력이 잘립니다. 예 : ping : write (1, "64 bytes from 1.0.0.1 : icmp_seq ="..., 56) = 56
izy

8

콘솔 / 터미널 뷰를 애플리케이션 출력에 '연결'하여 무슨 말을하는지 볼 수 있습니까?

이 질문에 대해서는 프로세스를 시작하기 전에 sceen 명령을 시작하지 않았더라도 출력을 잡을 수 있다는 것을 알고 있습니다.

시도한 적이 없지만 GDB를 사용하는 방법을 설명하는 흥미로운 기사를 찾았습니다 (프로세스를 다시 시작하지 않고).

실행중인 프로세스에서 출력 리디렉션

원래:

  1. / proc / xxx / fd 덕분에 프로세스의 열린 파일 목록을 확인하십시오.
  2. 붙이다GDB로 프로세스
  3. 일시 정지 된 상태에서 관심있는 파일을 닫고 close ()를 호출합니다. 함수를 합니다 (GDB에서 프로세스의 모든 기능을 사용할 수 있습니다. 프로세스에 디버그 기호가 필요하다고 생각합니다 ..)
  4. create () 또는 open () 함수를 호출하는 새 파일을 엽니 다. (마지막에 주석을 살펴보면 사람들이 dup2 () 를 사용하여 동일한 핸들 을 사용하도록 제안하는 것을 볼 수 있습니다.)
  5. 프로세스를 분리 하고 실행하십시오.

그건 그렇고, 당신이 i386 상자에서 리눅스 OS를 실행하고 있다면, 주석은 출력을 새로운 콘솔로 리디렉션하는 더 나은 도구에 대해 이야기하고 있습니다 : 'retty' . 그렇다면 사용을 고려하십시오.


5

나를 위해 이것은 일했습니다.

  1. 프로세스 소유자로 로그인합니다 ( root허가가 거부 된 경우도 있음 ).

    ~$ su - process_owner
    
  2. 다른 많은 답변에서 언급했듯이 파일 설명자를 꼬리표로 지정하십시오.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

로컬에서 실행 된 yum 업그레이드 프로세스를 원격으로보고 싶었으므로이 작업을 수행하는 더 효율적인 방법이있을 수 있지만 다음은 수행 한 작업입니다.

watch cat /dev/vcsa1

사용중인 터미널에 따라 vcsa2, vcsa3 등을 사용하고 싶을 것입니다.

내 터미널 창이 명령이 실행되는 터미널과 같은 너비이면 2 초마다 현재 출력의 스냅 샷을 볼 수 있습니다. 다른 곳에서 권장하는 다른 명령은 내 상황에서 특히 잘 작동하지 않았지만 그 방법은 트릭을 수행했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.