ps 는 그 순간의 프로세스 목록입니다. 두 옵션 스타일이 있어 헷갈리지만 두 형태만 씁니다.
| 명령 | 뜻 |
|---|---|
ps -ef |
전체, PPID 포함 |
ps aux |
전체, %CPU·%MEM 포함 |
ps aux --sort=-%mem | head |
메모리 상위 |
ps aux --sort=-%cpu | head |
CPU 상위 |
ps -u myapp |
사용자별 |
ps -ef --forest |
부모·자식 트리 |
ps -o pid,ppid,%cpu,%mem,etime,cmd -p PID 로 원하는 열만 볼 수 있습니다. etime 이 실행 경과 시간이라 "언제 떴나" 를 알려 줍니다.
ps aux 의 열은 사용자, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND 입니다.
| 열 | 뜻 |
|---|---|
| RSS | 실제 사용 메모리 KB |
| VSZ | 예약 가상 메모리, 참고만 |
| STAT | R 실행 S 대기 D I/O대기 Z 좀비 |
| TIME | 누적 CPU 시간 |
STAT 의 D 가 많으면 디스크가 느린 것이고, Z 는 부모가 거두지 않은 좀비로 자원은 안 쓰지만 부모 프로세스 버그 신호입니다.
pgrep -f 'app.jar' # 명령줄로 PID 찾기
pgrep -u myapp java # 사용자·이름으로
pkill -f 'app.jar' # 찾아서 TERM
kill PID # TERM (15)
kill -9 PID # KILL, 마지막 수단
kill -l # 신호 목록운영 묶음 03 의 원칙대로 TERM 을 먼저 보내고 기다립니다. pkill -f 는 패턴이 넓으면 엉뚱한 것까지 죽이므로 pgrep -f 로 먼저 목록을 봅니다.
top 은 대화형입니다. 열어 놓고 키로 조작합니다.
| 키 | 동작 |
|---|---|
| q | 나가기 |
| P / M | CPU / 메모리 순 정렬 |
| 1 | 코어별 CPU |
| k | PID 입력해 신호 보내기 |
| c | 전체 명령줄 표시 |
| H | 스레드 단위 |
스크립트에서는 top -b -n 1 | head -n 15 로 한 화면만 찍습니다. top -p PID 는 하나만, top -H -p PID 는 그 프로세스의 스레드별입니다.
top - 17:20:01 up 30 days, load average: 0.52, 0.61, 0.58
Tasks: 180 total, 1 running, 179 sleeping, 0 zombie
%Cpu(s): 12.0 us, 3.0 sy, 0.0 ni, 84.0 id, 1.0 wa
MiB Mem: 7821.0 total, 1205.0 free, 2410.0 used, 4206.0 buff/cache
MiB Mem: 4980.0 avail Mem| 항목 | 뜻 | 의심 기준 |
|---|---|---|
| load average | 실행 대기 수 | nproc 초과 |
| us | 사용자 프로그램 | 앱이 CPU 사용 |
| sy | 커널 | 시스템 호출 과다 |
| wa | I/O 대기 | 디스크 병목 |
| id | 유휴 | |
| avail Mem | 실제 여유 | 수백 MB 이하 |
wa 가 높으면 CPU 가 아니라 디스크 문제입니다. us 가 높으면 상위 프로세스를 보고 자바라면 운영 묶음 09 의 top -H 와 jstack 으로 갑니다.
total used free shared buff/cache available
Mem: 7821 2410 1205 120 4206 4980
Swap: 2047 0 2047available 이 새 프로세스가 쓸 수 있는 양입니다. buff/cache 는 필요하면 즉시 반환되는 캐시라 used 가 커도 문제가 아닙니다. Swap used 가 0 에서 늘기 시작하면 실제 부족입니다.
vmstat 1 5 는 1초 간격으로 5번 전체 통계를 찍습니다. top 보다 흐름을 보기 좋습니다.
| 열 | 뜻 |
|---|---|
| r | 실행 대기 프로세스 |
| b | I/O 대기 프로세스 |
| si / so | 스왑 인 / 아웃 |
| us sy id wa | CPU 비율 |
so 가 계속 0 이 아니면 메모리가 스왑으로 밀리는 것입니다. iostat -x 1 3 은 디스크별 %util 과 await 로 어느 디스크가 바쁜지 보여 줍니다. sysstat 패키지에 들어 있습니다.
df -h # 파티션별
df -i # inode
du -sh /var/log # 폴더 합계
du -xh --max-depth=1 / | sort -rh | headdf 가 찼는데 du 로는 안 보이면 삭제된 열린 파일입니다. lsof +L1 로 찾습니다. 운영 묶음 06 이 이 상황의 처치 순서입니다.
lsof -p PID | wc -l # 프로세스가 연 파일 수
lsof -i :8080 # 포트를 쓰는 프로세스
lsof -u myapp | head # 사용자가 연 것
ss -ltnp # 듣는 포트
ls /proc/PID/fd | wc -l # lsof 없을 때 FD 수lsof -i :포트 는 "누가 이 포트를 잡고 있나" 의 답이고 ss -ltnp 와 같은 정보를 줍니다. 06 네트워크 레슨에서 ss 를 더 봅니다.
우선순위는 -20 이 가장 높고 19 가 가장 낮습니다. 배치나 백업처럼 급하지 않은 작업은 양보하게 합니다.
nice -n 10 tar czf backup.tgz /data # 낮은 우선순위로 시작
renice -n 5 -p 1234 # 실행 중인 것 조정
ionice -c3 tar czf backup.tgz /data # I/O 우선순위 최하운영 앱과 같은 서버에서 백업을 돌릴 때 nice 와 ionice 를 함께 붙이면 앱 응답이 덜 흔들립니다.
| 명령 | 동작 |
|---|---|
명령 & |
백그라운드로 시작 |
| Ctrl+Z | 현재 작업 멈춤 |
bg |
멈춘 작업을 백그라운드로 |
fg |
앞으로 가져오기 |
jobs |
작업 목록 |
kill %1 |
작업 번호로 신호 |
nohup 명령 & |
터미널 닫아도 유지 |
긴 명령을 & 없이 시작했다면 Ctrl+Z 뒤 bg 로 뒤로 보내고 disown 으로 셸에서 떼면 터미널을 닫아도 됩니다.
모든 프로세스 정보는 /proc/PID/ 아래 파일입니다. 도구가 없을 때 직접 읽습니다.
grep -E 'VmRSS|Threads' /proc/1234/status # 메모리, 스레드 수
tr '\0' ' ' < /proc/1234/cmdline # 실행 명령줄
cat /proc/loadavg # 0.52 0.61 0.58 1/180 12345
head -n 3 /proc/meminfops·top·free 가 전부 이 파일들을 읽어 보여 주는 것입니다. 최소 설치 컨테이너에서 도구가 없을 때 유용합니다.