패각 스크립트로 strace 및 tcpdump를 가져올 때의 TIPS

ccpdump로curl에서nginx로의 HTTP 통신 포착
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을 함께 할 수 있습니다.

좋은 웹페이지 즐겨찾기