리눅스 시스템에서 프로세스 관리는 시스템 관리자나 개발자에게 필수적인 기술입니다. 프로세스 모니터링과 관리를 통해 시스템 성능을 최적화하고 문제를 신속하게 해결할 수 있습니다. 이 글에서는 리눅스 프로세스 관리의 핵심 명령어인 ps, top, kill, htop의 기능과 옵션, 그리고 실제 사용 예시를 자세히 알아보겠습니다.
1. ps 명령어 – 프로세스 상태 확인
ps(Process Status)는 현재 실행 중인 프로세스의 스냅샷을 보여주는 기본 명령어입니다. 시스템에서 실행되는 프로세스 목록, 리소스 사용량 및 상태 정보를 확인할 수 있습니다.
주요 옵션
- -e, -A: 모든 프로세스 표시
- -f: 프로세스에 대한 전체 정보(Full format) 표시
- -l: 긴 형식(Long format)으로 상세 정보 표시
- -u [사용자명]: 특정 사용자의 프로세스만 표시
- -p [PID]: 특정 PID의 프로세스만 표시
- –sort=[컬럼]: 특정 컬럼 기준으로 정렬
사용 예시
모든 프로세스 표시하기: 이 명령어는 시스템의 모든 프로세스를 간략하게 보여줍니다.
ps -e
전체 형식으로 모든 프로세스 표시하기: 사용자, PID, CPU 사용률, 메모리 사용률, 시작 시간 등 상세 정보를 확인할 수 있습니다.
ps -ef
사용자별 프로세스 확인하기: 특정 사용자(예: root)가 실행한 프로세스만 필터링하여 보여줍니다.
ps -u root
메모리 사용량 기준으로 정렬하기: 시스템에서 메모리를 많이 사용하는 프로세스를 파악할 때 유용합니다.
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
특정 프로세스 관련 정보만 확인하기: 특정 프로세스나 프로그램(예: nginx)을 검색하여 관련 프로세스만 표시합니다.
ps -ef | grep nginx
2. top 명령어 – 실시간 프로세스 모니터링
top 명령어는 실시간으로 시스템 상태와 프로세스 정보를 모니터링할 수 있는 도구입니다. 기본적으로 CPU 사용률이 높은 순서대로 프로세스를 정렬하여 보여줍니다.
주요 옵션
- -d [초]: 업데이트 간격 설정 (기본값: 3초)
- -p [PID]: 특정 PID만 모니터링
- -u [사용자명]: 특정 사용자의 프로세스만 표시
- -b: 배치 모드로 실행 (출력 파이프 연결 가능)
- -n [횟수]: 지정한 횟수만큼만 업데이트 후 종료
대화형 모드 단축키
- h: 도움말 표시
- k: 프로세스 종료 (kill)
- r: 프로세스 우선순위 변경 (renice)
- f: 표시할 필드 선택
- o/O: 정렬 필드 변경
- M: 메모리 사용량으로 정렬
- P: CPU 사용량으로 정렬
- q: 종료
사용 예시
기본 top 명령어 실행하기: 시스템의 전체적인 상태와 리소스 사용량, 실행 중인 프로세스를 확인할 수 있습니다.
top
업데이트 간격 변경하기: 1초 간격으로 화면을 갱신하여 더 실시간에 가깝게 모니터링합니다.
top -d 1
특정 프로세스만 모니터링하기: PID가 1234인 프로세스만 집중적으로 모니터링할 때 사용합니다.
top -p 1234
특정 사용자의 프로세스만 모니터링하기: 특정 사용자(예: www-data)가 실행한 프로세스만 모니터링합니다.
top -u www-data
배치 모드로 출력하여 파일에 저장하기: 모니터링 결과를 나중에 분석하기 위해 파일로 저장할 때 유용합니다.
top -b -n 1 > top_output.txt
3. kill 명령어 – 프로세스 종료
kill 명령어는 실행 중인 프로세스에 시그널을 보내 종료하거나 제어하는 데 사용됩니다. 가장 흔히 사용되는 것은 프로세스 종료지만, 다양한 시그널을 통해 여러 작업을 수행할 수 있습니다.
주요 시그널
- SIGTERM (15): 정상 종료 시그널 (기본값)
- SIGKILL (9): 강제 종료 시그널 (프로세스가 무조건 종료됨)
- SIGHUP (1): 설정 다시 로드 (많은 데몬 프로세스에서 사용)
- SIGSTOP (19): 프로세스 일시 중지
- SIGCONT (18): 중지된 프로세스 계속 실행
주요 옵션
- -l: 사용 가능한 모든 시그널 목록 표시
- -s [시그널]: 지정한 시그널 보내기
- -[시그널번호/이름]: 시그널 지정 (예: -9, -KILL)
사용 예시
기본 종료 시그널로 프로세스 종료하기: PID가 1234인 프로세스를 정상적으로 종료합니다.
kill 1234
강제 종료 시그널(SIGKILL)로 프로세스 종료하기: 응답하지 않는 프로세스를 강제로 종료할 때 사용합니다. 주의: 저장되지 않은 데이터가 손실될 수 있습니다.
kill -9 1234
설정 다시 로드하기: nginx와 같은 웹 서버의 설정을 다시 로드할 때 유용합니다.
kill -HUP 1234
사용 가능한 시그널 목록 확인하기: 사용 가능한 모든 시그널과 그 번호를 확인합니다.
kill -l
여러 프로세스 한 번에 종료하기: 여러 PID를 공백으로 구분하여 한 번에 종료할 수 있습니다.
kill 1234 5678 9012
4. htop 명령어 – 향상된 대화형 프로세스 뷰어
htop은 top의 향상된 버전으로, 컬러 표시와 사용자 친화적인 인터페이스를 제공합니다. 키보드 및 마우스로 프로세스를 쉽게 관리할 수 있는 대화형 도구입니다.
참고: htop은 기본 설치가 아닐 수 있으므로 필요시 설치해야 합니다.
# Debian/Ubuntu sudo apt install htop # CentOS/RHEL sudo yum install htop
주요 기능
- 컬러 표시로 가독성 향상
- 수평/수직 스크롤 지원
- 트리 뷰로 프로세스 관계 확인 가능
- 마우스 조작 지원
- 프로세스 필터링 및 검색 기능
주요 단축키
- F1: 도움말
- F2: 설정
- F3: 검색
- F4: 필터
- F5: 트리 뷰
- F6: 정렬 필드 선택
- F9: 프로세스 종료 (kill)
- F10: 종료
사용 예시
기본 htop 실행하기: 컬러풀한 인터페이스로 시스템 및 프로세스 상태를 확인할 수 있습니다.
htop
트리 뷰로 프로세스 계층 구조 확인하기: 프로세스 간의 부모-자식 관계를 시각적으로 확인할 수 있습니다.
htop -t
특정 사용자의 프로세스만 표시하기: 특정 사용자(예: postgres)가 실행한 프로세스만 필터링하여 보여줍니다.
htop -u postgres
특정 프로세스만 모니터링하기: PID가 1234인 프로세스와 그 자식 프로세스만 모니터링합니다.
htop -p 1234
5. 추가 프로세스 관리 명령어
리눅스에서는 위의 명령어 외에도 프로세스 관리에 유용한 다양한 명령어들이 있습니다.
pkill – 프로세스 이름으로 종료
pkill은 프로세스 이름을 기반으로 프로세스를 찾아 종료할 수 있는 명령어입니다.
사용 예시
이름에 ‘firefox’가 포함된 모든 프로세스 종료하기: Firefox 브라우저와 관련된 모든 프로세스를 종료합니다.
pkill firefox
특정 사용자의 프로세스만 종료하기: 특정 사용자(예: john)가 실행한 apache 관련 프로세스만 종료합니다.
pkill -u john apache
시그널 지정하여 프로세스 종료하기: SIGKILL 시그널을 사용하여 응답하지 않는 프로세스를 강제 종료합니다.
pkill -9 chrome
killall – 프로세스 이름으로 모든 인스턴스 종료
killall은 지정된 이름과 정확히 일치하는 모든 프로세스를 종료하는 명령어입니다.
사용 예시
정확한 이름으로 프로세스 종료하기: ‘nginx’라는 이름의 모든 프로세스를 종료합니다.
killall nginx
특정 시간 이상 실행된 프로세스 종료하기: 3시간 이상 실행된 httpd 프로세스를 종료합니다.
killall -o 3h httpd
특정 시간 미만 실행된 프로세스 종료하기: 5분 미만으로 실행된 php-fpm 프로세스를 종료합니다.
killall -y 5m php-fpm
pgrep – 프로세스 ID 찾기
pgrep은 지정된 패턴에 맞는 프로세스의 PID를 찾아주는 명령어입니다.
사용 예시
이름에 ‘ssh’가 포함된 프로세스의 PID 찾기: SSH 관련 프로세스의 PID를 찾아 출력합니다.
pgrep ssh
특정 사용자의 프로세스 PID 찾기: 특정 사용자(예: www-data)가 실행한 프로세스의 PID를 찾습니다.
pgrep -u www-data
전체 명령어 정보와 함께 표시하기: 프로세스 ID와 함께 전체 명령어 라인을 표시합니다.
pgrep -a mysql
nice/renice – 프로세스 우선순위 조정
nice와 renice는 프로세스의 실행 우선순위(니스 값)를 조정하는 명령어입니다. 니스 값은 -20(가장 높은 우선순위)부터 19(가장 낮은 우선순위)까지 설정할 수 있습니다.
사용 예시
낮은 우선순위로 명령어 실행하기: 백업 작업과 같이 백그라운드에서 실행되는 작업에 낮은 우선순위를 부여합니다.
nice -n 19 tar -czf backup.tar.gz /home
실행 중인 프로세스의 우선순위 변경하기: PID가 1234인 프로세스의 우선순위를 높입니다.
renice -n -10 -p 1234
특정 사용자의 모든 프로세스 우선순위 변경하기: 특정 사용자(예: backup)가 실행한 모든 프로세스의 우선순위를 낮춥니다.
renice +10 -u backup
nohup – 로그아웃 후에도 프로세스 실행 유지
nohup은 터미널 연결이 끊어져도 프로세스가 계속 실행되도록 하는 명령어입니다.
사용 예시
백그라운드에서 장시간 실행되는 작업 시작하기: 서버에서 로그아웃해도 계속 실행되어야 하는 장시간 작업에 유용합니다.
nohup python long_running_script.py &
출력을 특정 파일로 리다이렉트하기: 명령어 실행 결과를 특정 파일로 저장합니다.
nohup wget https://example.com/largefile.zip > download.log 2>&1 &
6. 프로세스 관리 실전 팁
문제 프로세스 찾고 해결하기
CPU나 메모리를 과도하게 사용하는 프로세스를 찾아 관리하는 방법입니다.
# CPU 사용률이 높은 상위 5개 프로세스 찾기
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -n 6
# 메모리 사용률이 높은 상위 5개 프로세스 찾기
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head -n 6
좀비 프로세스 처리하기
좀비 프로세스는 이미 종료되었지만 부모 프로세스가 종료 상태를 확인하지 않아 시스템 테이블에 남아있는 프로세스입니다.
# 좀비 프로세스 찾기
ps aux | grep Z
# 좀비 프로세스의 부모 PID 찾기
ps -ef | grep [좀비 프로세스 PID]
# 부모 프로세스 종료하기 (최후의 수단)
kill -9 [부모 프로세스 PID]
주의사항
- kill -9 사용 주의: SIGKILL(9) 시그널은 프로세스가 정리 작업을 수행할 기회를 주지 않고 즉시 종료시키므로, 데이터 손실이나 파일 손상의 위험이 있습니다. 먼저 기본 SIGTERM을 시도하고, 응답이 없을 때만 SIGKILL을 사용하세요.
- root 권한 프로세스 종료 주의: 시스템 중요 프로세스를 종료하면 시스템 불안정이나 다운타임이 발생할 수 있습니다. 특히 PID 1 (init 또는 systemd)은 절대 강제 종료하지 마세요.
- 대량 프로세스 종료 신중히: 와일드카드나 패턴 매칭으로 여러 프로세스를 한 번에 종료할 때는 먼저 어떤 프로세스가 영향을 받는지 확인하세요.
# 종료 전에 먼저 확인
pgrep -l apache
# 확인 후 종료
pkill apache
리눅스에서 프로세스 관리는 시스템 관리와 문제 해결의 핵심입니다. ps, top, kill, htop과 같은 기본 도구들을 능숙하게 사용하면 시스템 성능을 효과적으로 모니터링하고 문제가 되는 프로세스를 빠르게 식별하여 조치할 수 있습니다. 이번 포스트에서 소개한 명령어와 옵션들을 잘 참고하시어 리눅스 시스템 관리 능력을 한 단계 높여보시면 어떨까 합니다. 🙂