개요
프로그램이 백그라운드에서 운영체제와 어떻게 통신하는지 파악하는 것은 리눅스 트러블슈팅의 핵심입니다. 시스템 콜 추적 도구인 strace를 직접 설치하고 실행해 보며 동작 원리와 문제 해결 기술을 익힙니다.
strace 설치 및 기본 시스템 콜 추적
strace 실습 진행을 위해 패키지 목록을 갱신하고 strace 패키지를 설치합니다.

시스템 콜 추적 실습에 사용할 대상 텍스트 파일을 생성하기 위해 echo 'Linux strace test content' > /tmp/testfile.txt 명령어를 실행합니다.

strace 명령어는 프로그램이 실행되는 동안 커널과 상호작용하는 시스템 콜과 수신 신호를 실시간으로 가로채어 추적합니다.cat 명령어를 strace로 실행하면 파일을 열고(openat), 읽고(read), 출력하고(write), 닫는(close) 전체 시스템 콜 흐름을 터미널에서 직접 확인할 수 있습니다.
⚙️ [주요 옵션]
-c : 실행된 시스템 콜의 호출 횟수, 총 소요 시간, 에러 횟수 등의 통계 요약 정보를 출력합니다.-e : 특정 시스템 콜이나 이벤트 유형만 필터링하여 추적합니다.-o : 추적한 시스템 콜 출력 결과를 화면 대신 지정한 파일에 저장합니다.-p : 실행 중인 특정 프로세스의 PID를 지정하여 실시간으로 시스템 콜을 추적합니다.-T : 각 시스템 콜을 처리하는 데 소요된 시간을 줄 끝에 표시합니다.-tt : 각 시스템 콜이 호출된 시각을 마이크로초 단위까지 포함하여 출력합니다.-s : 시스템 콜 인자로 전달된 문자열의 최대 출력 길이를 바이트 단위로 지정합니다.

특정 시스템 콜 필터링(-e trace 옵션)
strace -e trace=openat,read,write,close cat /tmp/testfile.txt 명령어는 cat 명령어가 동작하는 동안 발생하는 수많은 시스템 콜 중 지정한 openat, read, write, close만 선별하여 추적합니다.
추적하고자 하는 핵심 시스템 콜들을 쉼표로 연결하여 지정함으로써 불필요한 시스템 콜 출력을 줄이고 파일 입출력 흐름만 집중해서 확인할 수 있습니다.

strace -e trace=file ls -l /tmp/testfile.txt 명령어는 파일 접근 및 경로 처리와 관련된 시스템 콜 전체를 묶어서 추적하는 file 클래스 필터를 적용합니다.
개별 시스템 콜 이름을 일일이 나열하지 않고도 파일 경로 탐색, 권한 확인, 파일 정보 조회 등 파일 작업과 연관된 모든 시스템 콜을 한 번에 모니터링할 수 있습니다.

시스템 콜 통계 및 성능 병목 요약(-c 옵션)
strace -c ls -la /usr/bin > /dev/null 명령어는 대량의 파일이 위치한 /usr/bin 디렉터리 목록을 조회하는 과정에서 호출된 시스템 콜의 통계 요약을 출력합니다.
표준 출력을 /dev/null로 리다이렉트하여 화면 출력을 배제하고, 프로그램 종료 시 각 시스템 콜의 시간 점유율, 총 소요 시간, 호출 횟수, 에러 발생 횟수를 요약 테이블로 분석할 수 있습니다.

strace -c grep -rn 'root' /etc/passwd > /dev/null 명령어는 /etc/passwd 파일에서 특정 문자열을 검색하는 동안 호출된 시스템 콜의 성능 통계를 집계합니다.
검색 결과를 /dev/null로 보내고 시스템 콜 통계만 확인하여, 파일 열기 및 읽기 등 검색 작업 전반에서 어떤 시스템 콜이 가장 많은 시간과 자원을 소모했는지 병목 구간을 빠르게 파악할 수 있습니다.

실행 중인 프로세스 추적 및 로그 파일 저장(-p, -o 옵션)
실시간 추적 실습을 위해 백그라운드에서 지속 실행되는 대상 프로세스를 생성하고자 sleep 100 & 명령어를 실행합니다.

방금 백그라운드로 실행된 프로세스의 PID를 셸 변수에 할당하기 위해 TARGET_PID=$! 명령어를 실행합니다.

strace -p $TARGET_PID -o /tmp/strace_output.log -t & 명령어는 지정한 PID의 실행 중인 프로세스에 연결하여 시스템 콜을 백그라운드에서 추적하고, 초 단위 타임스탬프와 함께 결과를 로그 파일에 기록합니다.
터미널 세션을 방해하지 않고 백그라운드 로그 파일에 기록하므로, 운영 중인 서비스나 데몬 프로세스의 동작 과정을 안전하게 수집하여 사후 분석할 수 있습니다.

strace가 대상 프로세스에 정상적으로 연결되어 추적을 시작할 수 있도록 잠시 대기하기 위해 sleep 1 명령어를 실행합니다.

추적 실습을 마무리하고 백그라운드에서 동작 중이던 대상 프로세스를 정리하기 위해 kill $TARGET_PID 명령어를 실행합니다.

head -n 20 /tmp/strace_output.log 명령어는 파일로 저장된 strace 추적 로그의 상위 내용을 확인합니다.
로그를 통해 대상 프로세스가 SIGTERM 시그널을 수신하고 프로세스 종료 상태에 도달하는 시스템 콜 흐름을 명확하게 확인할 수 있습니다.

지금까지 리눅스 디버깅의 치트키인 strace를 활용해 시스템 콜을 직접 추적하고 분석하는 방법을 살펴보았습니다.
원인 모를 에러나 프로세스 지연으로 막막할 때 strace로 시스템 내부 동작을 짚어가며 빠르고 명쾌하게 문제를 해결해보시기 바랍니다.