다른 bash 세션에서 실행 중인 프로세스의 출력을 어떻게 볼 수 있나요?

다른 bash 세션에서 실행 중인 프로세스의 출력을 어떻게 볼 수 있나요?

로컬로 작업하는 동안 원격 컴퓨터에서 실행되는 스크립트가 남습니다. 동일한 사용자로 SSH를 통해 컴퓨터에 연결하고 ps.

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

로컬 세션에서 stdout으로 인쇄합니다( ./ipchecker.sh로컬 터미널 창에서 실행 중이며 리디렉션 없음, 사용 없음 screen등).

어쨌든 SSH 세션 내에서(중지하지 않고) 이 실행 명령의 출력을 볼 수 있습니까?

지금까지 제가 찾은 가장 좋은 방법은 을 사용하는 것입니다. strace -p 18386하지만 화면을 가로질러 날아다니는 수많은 텍스트가 보이고 너무 자세합니다. 출력을 중지 strace한 다음 필터링하여 stdout에 인쇄된 텍스트를 찾을 수 있지만 매우 길고 혼란스러우며 중지하면 분명히 뭔가를 놓칠 수 있습니다. 마치 로컬에서 작업하는 것처럼 실시간으로 스크립트 출력을 볼 수 있는 방법을 찾고 싶습니다.

누구든지 이것을 개선할 수 있나요? 확실한 대답은 세션 등에서 스크립트를 리디렉션하거나 다시 시작하는 것입니다 screen. 이는 업무상 중요한 스크립트가 아니므로 그렇게 할 수 있습니다. 오히려 재미있는 학습운동이라고 생각했어요.

답변1

파일 시스템을 통해 출력에 액세스할 수 있습니다 proc.

tail -f /proc/<pid>/fd/1

1= 표준 출력, 2= 표준 오류

(또는 @jmhostalet이 말한 것처럼: cat /proc/<pid>/fd/1tail이 작동하지 않는 경우)

답변2

기존 프로세스만 모니터링하려는 경우 strace -p1234 -s9999 -e write프로세스 ID가 1234인 곳을 사용할 수 있습니다. ( -s9999문자열을 32자로 자르는 것과 출력을 생성하는 시스템 호출을 피 하십시오. ) write특정 파일 설명자에 기록된 데이터만 보려면 strace -p1234 -e trace= -e write=3파일 설명자 3에 기록된 데이터만 보기와 같은 것을 사용할 수 있습니다. -e trace=시스템 호출이 기록됩니다.) 이렇게 하면 이미 생성한 출력이 제공되지 않습니다.

출력이 너무 빠르게 스크롤되면 이를 호출기로 파이프하거나(예: )을 사용하여 less페이지로 보낼 수 있습니다 strace -o trace.log ….

많은 프로그램의 경우 ptrace 해킹을 사용하여 후속 출력을 현재 터미널이나 새 스크린 세션으로 전송할 수 있습니다. 바라보다실행 중인 프로세스를 거부하고 이를 새 화면 셸에 연결하는 방법은 무엇입니까?그리고 다른 연결된 스레드.

시스템 설정 방법에 따라 strace프로세스가 추가 권한 없이 사용자로 실행되는 경우에도 이러한 명령을 모두 루트로 실행해야 할 수도 있습니다. (프로세스가 다른 사용자로 실행 중이거나 setuid 또는 setgid인 경우 strace루트로 실행해야 합니다.)대부분의 배포판에서는 프로세스가 하위 항목을 추적하는 것만 허용합니다.(이는 약간의 보안 이점을 제공합니다. 즉, 일부 직접적인 맬웨어 주입을 방지하지만 파일 수정을 통한 간접적인 주입은 방지합니다.) 이는 kernel.yama.ptrace_scomesysctl에 의해 제어됩니다.

답변3

BSD에서는 다음을 사용할 수 있습니다.watch주어진 tty를 수신합니다.

watch /dev/pts/0

screenLinux에서는 이전에 또는 와 같은 멀티플렉서에서 프로세스가 실행되지 않은 경우 이는 불가능합니다 tmux. 또한보십시오:Reptyr: 실행 중인 프로세스를 새 터미널에 연결

유일한 방법은 프로세스를 디버깅하는 것입니다( 예: strace/ ,dtracedtrussgdb, lldb,등. ).

를 사용했기 때문에 의미 있는 출력을 얻으려면 한정 표현식(예:)으로 필터링한 다음 출력을 구문 분석 strace해야 합니다 . file예는 다음과 같습니다.

strace -e trace=write -s1000 -fp 18386 2>&1 | grep -o '".\+[^"]"'

이것이 하는 일은 PID(길이 1000)로 지정된 프로세스의 쓰기 작업을 인쇄하고( pgrep이름으로 조회용), 표준 오류를 출력으로 리디렉션하고(필터링용), 큰따옴표로 묶인 문자열을 인쇄하는 것입니다.

바이너리 출력을 처리하는 경우 read(with -r) 및 printf (with %b)를 사용하여 이스케이프 시퀀스 문자를 구문 분석할 수 있습니다.

while read -r -t1 line; do printf "%b" $line; done

더 많은 매개변수를 확인하세요 help read(예: -n줄 바꿈 대신 특정 문자 수 뒤에 인쇄).

다음은 보다 완전한 예입니다.

strace -e trace=write -s1000 -fp 18386 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

프로세스를 사용하는 예는 다음을 확인하세요.쉘에서 strace를 일반 텍스트로 구문 분석하는 방법은 무엇입니까?스택 오버플로 시

답변4

stderr 및 stdout을 얻으려면 다음을 실행할 수 있습니다.

tail -f /proc/<pid>/fd/*

관련 정보