programing

이미 실행 중인 프로세스의 출력을 리디렉션하는 방법

lastcode 2023. 4. 27. 22:28
반응형

이미 실행 중인 프로세스의 출력을 리디렉션하는 방법

보통 나는 다음과 같은 명령을 시작합니다.

longcommand &;

다음과 같은 방법으로 리디렉션할 수 있다는 것을 알고 있습니다.

longcommand > /dev/null;

예를 들어 출력을 제거하거나.

longcommand 2>&1 > output.log

출력을 캡처합니다.

하지만 저는 가끔 잊어버리고, 그 사실 이후에 캡처하거나 방향을 바꿀 방법이 없을까 생각했습니다.

longcommand
ctrl-z
bg 2>&1 > /dev/null

단말기에 메시지가 뜨지 않고 단말기를 계속 사용할 수 있도록 하는 것입니다.

실행 중인 프로세스의 출력 리디렉션을 참조하십시오.

먼저 명령을 실행합니다.cat > foo1한 세션에서 stdin의 데이터가 파일에 복사되는지 테스트합니다.그런 다음 다른 세션에서 출력을 리디렉션합니다.

먼저 프로세스의 PID를 찾습니다.

$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

이제 열려 있는 파일 핸들을 확인합니다.

$ 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 6.4.90-debian

[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/foo3", 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

pGDB의 명령어는 식의 값을 인쇄할 것이고, 식은 호출할 함수가 될 수 있고, 시스템 호출이 될 수 있습니다. 그래서 저는 다음을 실행합니다.close()시스템 호출 및 파일 핸들 1을 전달한 후, 나는 다음을 실행합니다.creat()새 파일을 열기 위한 시스템 호출.의 결과입니다.creat()이는 이전 파일 핸들을 대체했음을 의미합니다.만약 내가 stdout과 stderr에 동일한 파일을 사용하고 싶거나 파일 핸들을 다른 번호로 바꾸고 싶다면, 나는 전화해야 합니다.dup2()시스템 호출을 통해 결과를 얻을 수 있습니다.

이 예에서 사용하기로 선택했습니다.creat()대신에open()모수가 적기 때문입니다.플래그에 대한 C 매크로는 GDB에서 사용할 수 없기 때문에(C 헤더를 사용하지 않음) 헤더 파일을 읽어야 검색할 수 있습니다. 그렇게 하는 것은 어렵지 않지만 시간이 더 걸릴 것입니다.0600은 읽기/쓰기 액세스 권한을 가진 소유자와 그룹 및 기타 사용자가 액세스할 수 없는 경우의 8진수 권한입니다.또한 해당 매개 변수에 0을 사용하고 나중에 파일에서 chmod를 실행할 수 있습니다.

그런 다음 결과를 확인합니다.

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

추가 데이터 입력cat파일의 결과/tmp/foo3부속의

원래 세션을 닫으려면 해당 세션에 대한 모든 파일 핸들을 닫고 제어할 수 있는 새 장치를 연 다음 호출해야 합니다.setsid().

다음을 사용하여 수행할 수도 있습니다.reredirect(https://github.com/jerome-pouiller/reredirect/) .

아래 명령은 프로세스의 출력(표준 및 오류)을 리디렉션합니다.PIDFILE:

reredirect -m FILE PID

READMEreredirect또한 프로세스의 원래 상태를 복원하는 방법, 다른 명령으로 리디렉션하거나 stdout 또는 stderr만 리디렉션하는 방법 등의 다른 흥미로운 기능도 설명합니다.

또한 이 도구는 다음과 같은 기능을 제공합니다.relink출력을 현재 단자로 리디렉션할 수 있는 스크립트:

relink PID
relink PID | grep usefull_content

(reredirect다른 답변에 설명된 Dupx와 동일한 기능을 가지고 있는 것으로 보이지만 Gdb에 의존하지 않습니다.)

듀플렉스

Dupx는 이미 실행 중인 프로세스의 표준 출력/입력/오류를 리디렉션하는 간단한 *nix 유틸리티입니다.

동기

SSH를 통해 원격 시스템에서 시작한 프로세스가 예상보다 훨씬 오래 걸리는 경우가 종종 있었습니다.SSH 연결을 끊어야 하는데, 끊어진 파이프의 stdout/error에 기록하려고 하면 프로세스가 중단됩니다.^Z로 프로세스를 일시 중단하고 다음을 수행할 수 있으면 좋겠습니다.

bg %1 >/tmp/stdout 2>/tmp/stderr 

유감스럽게도 이것은 작동하지 않을 것입니다(제가 아는 껍질에서).

http://www.isi.edu/ ~http/dupx/

화면.

프로세스가 화면 세션에서 실행 중인 경우 화면의 log 명령을 사용하여 해당 창의 출력을 파일에 기록할 수 있습니다.

스크립트의 창으로 전환하여 기록합니다.
이제 다음을 수행할 수 있습니다.

$ tail -f screenlog.2 | grep whatever

화면의 맨 페이지에서:

로그 온[오프]

현재 창의 출력을 창의 기본 디렉터리에 있는 "screenlog.n" 파일에 쓰기 시작/중지합니다. 여기서 n은 현재 창의 번호입니다.이 파일 이름은 'logfile' 명령을 사용하여 변경할 수 있습니다.매개 변수가 지정되지 않으면 로깅 상태가 전환됩니다.세션 로그는 파일의 이전 내용이 이미 있는 경우 해당 내용에 추가됩니다.현재 내용과 스크롤백 내역의 내용은 세션 로그에 포함되지 않습니다.기본값은 '꺼짐'입니다.

저는 tmux에도 비슷한 것이 있다고 확신합니다.

저는 인터넷에서 몇 가지 정보를 수집하여 외부 도구가 필요 없는 스크립트를 준비했습니다.여기에서 내 응답을 확인하십시오.도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/1323956/how-to-redirect-output-of-an-already-running-process

반응형