패각 스크립트로 strace 및 tcpdump를 가져올 때의 TIPS
4390 단어 ShellScriptstracetcpdumptech
strace에서nginx의 시스템 호출을 추적하고 싶은 일이 있어요.
나는 조개 각본을 썼다.
그때 TIPS 시행착오 때문에 미리 적어놨어요.
nginx와 같은 여러 과정 중,stracce의 -ff와-o는 매우 편리하다
strace (1)에 쓰인 말은 최근까지 몰랐기 때문에 먼저 적었다.
strace -ff -o ファイル名 straceを取りたいコマンド コマンドの引数...
에서 보듯이 대상의 명령은 하위 프로세스를 시작한 후strace를 사용합니다.이 때 파일 이름은 지정한 파일 이름 뒤에 있습니다.및 PID의 파일 이름입니다.예를 들어 다음과 같이 실행한다.
strace -ff -o nginx-strace.log /usr/sbin/nginx -g 'daemon off;'
따라서 예를 들어 주처리의 PID가 202143이면 작업 프로그램이 하나이고 PID가 202144이면 nginx-Sstrace이다.log.202143과nginx-strace.log.202144 두 파일을 만들겠다는 얘기지.tcpdump의-w로 파일에 쓸 때. -U도 정해진 경우가 있어요.
이것도 tcpdump (8)
-U
--packet-buffered
에 적혀있는데 몰라서 빠져서 소개할게요.tcpdump에서
-w ファイル名
를 지정하면 저장 결과를 파일에 출력하고 버퍼링합니다.이렇게 하면 포착하고 싶은 통신이 끝난 후에도 Ctrl-C와kill이 tcpdump를 멈추고 버퍼를 파일에 쓰지 않습니다.예전에는 이걸 몰랐어요. 통신 후 몇 초를 기다린 후에 tcpdump를 멈추려고 했지만 예전처럼 마지막 가방이 나오지 않아서 고민했어요. 버퍼가 됐어요.
-U
도 지정하면 매번 파일에 출력되는 버퍼링을 하지 않기 때문에 문제가 없습니다.대량의 통신을 포착할 경우-U
는 열지 않는 것이 좋지만,curl에 요청이 1개 있으면-U
을 추가하는 것이 좋다.예를 들어strace를 지정하는 동시에nginx를 시작하고 tcpdump로 그룹을 포착하는 경우 다음과 같다.
strace -ff -o $log_dir/nginx-strace.log nginx -g 'daemon off;' &
tcpdump -i any -U -w "$log_dir/tcpdump.bin.log" tcp port 80 &
프로세스 그룹을 사용하면 여러 개의 시작된 프로세스를 통합하고 호출할 수 있습니다
위에서 말한 바와 같이 여러 프로세스를 시작하는데 검증용 통신이 끝난 후에 함께 멈추고 싶은 상황에서 각 프로세스의 PID를 조사하고 킬을 하는 것은 매우 번거롭다.
kill (1)에서 PID에 마이너스로 처리팀의 ID를 지정하면 그 처리팀 내의 모든 과정을 킬할 수 있다는 것을 알게 되었다.
현재 프로세스의 프로세스 그룹 ID는 다음 명령을 통해 얻을 수 있습니다.
pgid=$(ps -p $$ -o pgid --no-headers)
프로세스 그룹을 호출합니다kill -- -$pgid
또는kill -TERM -$pgid
집행.수치로 신호를 지정할 때-15
처리 그룹 ID의 기호 반전을 구별할 수 없기 때문에 신호를 생략할 때는 --
로 구분하거나 처음에 신호를 생략하지 않는 옵션으로 써야 한다.스크립트를 실행할 때, 모든 알림이kill됩니다.셸 스크립트만 시작하면 셸 알림과 같은 처리 그룹에서 실행되기 때문입니다.
검색 후 setsid (1) 명령이 있습니다.이 옵션을 사용하면 다른 프로세스 그룹을 만들고 스크립트를 실행할 수 있습니다.
실제 사용 시 조개 스크립트를 두 부분으로 나누어 다음과 같다.
run.sh
#!/bin/bash
usage() {
cat <<EOF >&2
Usage: $0 test_case
test_case must be integer between 1 and 3.
EOF
exit 2
}
if [ $# -ne 1 ]; then usage; fi
if [ "$1" -lt 1 ] || [ "$1" -gt 3 ]; then usage; fi
test_case=$1
log_dir=log-testcase$test_case
mkdir $log_dir
sudo setsid ./do_run.sh $test_case $log_dir 2>&1 | tee $log_dir/do_run.log
sudo chown -R $USER: $log_dir
tcpdump -A -n -vvv -r "$log_dir/tcpdump.bin.log" > "$log_dir/tcpdump.log"
do_run.sh
#!/bin/bash
test_case=$1
log_dir=$2
set -e
set -x
strace -ff -o $log_dir/nginx-strace.log nginx -g 'daemon off;' &
tcpdump -i any -U -w "$log_dir/tcpdump.bin.log" tcp port 80 &
sleep 2
pgid=$(ps -p $$ -o pgid --no-headers)
ps -efj | awk 'NR == 1 || ($4 == '$pgid' && $10 == "nginx:") {print}'
case $test_case in
1) strace -o $log_dir/curl-strace.log curl -sSv http://localhost/ http://localhost/ > $log_dir/curl.log 2>&1 ;;
2) strace -o $log_dir/curl-strace.log curl -sSv --no-keepalive $curl_ka http://localhost/ http://localhost/ > $log_dir/curl.log 2>&1 ;;
3) strace -o $log_dir/curl-strace.log curl -sSv -H 'User-Agent: MSIE 6.0' -X POST http://localhost/ http://localhost/ > $log_dir/curl.log 2>&1 ;;
esac
sleep 2
kill -- -$pgid
run.sh
에서 setsid
로 시작하고do_run.sh
do_run.sh
마지막에killkilldo_run.sh
로 전체 프로세스 그룹을 활성화합니다.이렇게 하면
do_run.sh
자신이 시작한 배경 프로세스와kill을 함께 할 수 있습니다.
Reference
이 문제에 관하여(패각 스크립트로 strace 및 tcpdump를 가져올 때의 TIPS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hnakamur/articles/strace-tcpdump-shell-script-tips텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)