로컬에서 작업 할 때부터 원격 컴퓨터에서 스크립트를 실행했습니다. 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
세션 등으로 스크립트를 다시 시작하는 것입니다. 이것은 미션 크리티컬 스크립트가 아니므로 그렇게 할 수 있습니다. 오히려, 나는 이것을 재미있는 학습 연습으로 본다.
답변
기존 프로세스를 스파이하려는 경우 strace -p1234 -s9999 -e write
1234는 프로세스 ID입니다. ( -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_scome
sysctl에 의해 제어됩니다 .
답변
proc
파일 시스템을 통해 출력에 액세스 할 수 있습니다 .
tail -f /proc/<pid>/fd/1
1
= stdout, 2
= stderr
답변
BSD에서는 watch
어떤 tty를 주어진 tty로 사용할 수 있습니다.
watch /dev/pts/0
Linux에서는 screen
또는 과 같은 전에 멀티플렉서에서 프로세스를 실행하지 않은 경우에는 불가능합니다 tmux
. 참조 : Reptyr : 실행중인 프로세스를 새 터미널에 연결
(예를 들면 유일한 방법은 프로세스를 디버깅하는 것 strace
, dtrace
/ dtruss
, gdb
, 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를 일반 텍스트로 구문 분석하는 방법은 무엇입니까? 스택 오버 플로우
답변
-
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
wherelocalhost
는 원격 서버 로그인 자격 증명으로 대체되고:0.0
GUI의 표시 번호로 원격 화면을 들여다 볼 수 있습니다 . -
사용
x11vnc
화면에 X-세션에 대한 VNC 서버입니다. -
6 개의 가상 콘솔 중 하나에서 실행할 때 적절한 vc로
sudo setterm -dump 2 -file /dev/stdout
바꾸십시오2
.
답변
명명 된 파이프 ( mkfifo
)를 만든 다음 해당 파일에 쓰는 것이 좋습니다. 그런 다음 읽어보십시오. tail
출력을 최소화하기 위해, 등으로 항상 그렇게 할 수 있습니다 . 파이프를 읽을 때 (파이프에서 읽을 때마다) 지워 지므로 출력이 유지되지 않습니다.
다른 옵션은 모든 것을 파일 (로그 파일과 유사)에 쓴 다음 언제든지 분석하는 것입니다. 모든 출력을 유지하려는 경우 선호되는 조치입니다.
답변
당신은 항상 nohup 및 & 프로세스를 시작할 수 있습니다
nohup rsync source_file dest_file &
그런 다음 모든 tty에서 진행 상황을 확인할 수 있습니다.
tail -f nohup.out
이것은 나에게 잘 작동합니다.
답변
출력을 얻는 매우 간단한 방법은 출력을 파일로 캡처하고 해당 파일을 마무리하는 것입니다.
해야 할 경우 : ./ipcheck
INSTEAD DO : ./ipcheck> [파일 이름으로 교체]
스크립트가있는 출력 파일이 생성됩니다. 그런 다음 다른 bash 쉘에서 간단히 파일을 꼬리말로 붙일 수 있습니다.
tail [파일 이름으로 대체] -f