"어젯밤 두 시에 무엇이 CPU 를 다 썼는지" 나 "누가 언제 그 명령을 실행했는지" 는 사고가 난 뒤에는 알 수 없다. 미리 기록하도록 설정해 둬야만 확인할 수 있다. 기본 설치 상태에서는 둘 다 충분히 남지 않는다.
기본 bash 는 셸이 정상 종료할 때만 ~/.bash_history 에 쓰고, 시각을 남기지 않으며, 여러 터미널을 동시에 쓰면 마지막에 닫은 세션이 앞선 기록을 덮는다.
/etc/profile.d/history.sh 에 다음을 둔다.
# 메모리와 파일에 남길 줄 수
export HISTSIZE=10000
export HISTFILESIZE=50000
# 각 명령 앞에 실행 시각을 남긴다
export HISTTIMEFORMAT='%F %T '
# 덮어쓰지 않고 이어 붙인다
shopt -s histappend
# 명령마다 즉시 파일에 반영하고 다른 세션의 기록을 읽어 온다
export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND:-}"
| 설정 | 역할 |
|---|---|
HISTTIMEFORMAT |
시각 기록. 설정하기 전에 쌓인 항목에는 시각이 없다 |
histappend |
세션이 서로의 기록을 덮지 않게 한다 |
history -a |
새 줄을 파일에 즉시 덧붙인다 |
history -n |
파일에 새로 들어온 줄을 현재 세션으로 읽는다 |
HISTCONTROL=ignorespace 가 켜져 있으면 공백으로 시작하는 명령은 기록되지 않는다. 비밀번호가 들어간 명령을 감추는 데 쓰지만, 감사 목적이라면 꺼 둬야 한다.
셸 이력은 감사 근거가 아니다. 사용자가 history -c 로 지우거나 HISTFILE 을 /dev/null 로 바꾸면 그만이다. 실제 감사가 필요하면 auditd 나 세션 기록 도구(tlog, sudo 로그)를 쓴다.
# 메모리 상위
ps -eo pid,ppid,user,%mem,rss,comm --sort=-%mem | head -20
# CPU 상위
ps -eo pid,ppid,user,%cpu,comm --sort=-%cpu | head -20
# 한 번만 찍어 파일로
top -b -n 1 > /tmp/snapshot_$(date +%Y%m%d%H%M).txt
기록 수집기가 미리 돌고 있어야 한다.
시스템 전체 지표를 10분 간격으로 남긴다. 프로세스 단위가 아니라 전체 추이를 본다.
sudo dnf install -y sysstat
sudo systemctl enable --now sysstat
RHEL 계열은 /var/log/sa/ 에 sa<일> 파일이 쌓인다. 보존 기간은 /etc/sysconfig/sysstat 의 HISTORY 값이며 기본 28일이다. Debian 계열은 /etc/default/sysstat 의 ENABLED="true" 를 켜야 수집이 시작된다.
# 오늘 CPU 추이
sar -u
# 특정 날짜 파일에서 시간 구간 지정
sar -u -f /var/log/sa/sa19 -s 01:00:00 -e 03:00:00
# 메모리 · 디스크 · 네트워크
sar -r -f /var/log/sa/sa19
sar -d -p -f /var/log/sa/sa19
sar -n DEV -f /var/log/sa/sa19
프로세스 단위로 과거 상태를 되감아 볼 수 있다. sar 로는 "그때 CPU 가 90% 였다" 까지만 알 수 있지만 atop 은 "그때 어느 프로세스가 썼는지" 를 보여 준다.
sudo dnf install -y atop
sudo systemctl enable --now atop
# 그날 기록을 연다
atop -r /var/log/atop/atop_20260919
# 시각을 지정해 그 시점부터 본다
atop -r /var/log/atop/atop_20260919 -b 02:00
화면 안에서 t 는 다음 간격, T 는 이전 간격, m·d·n 은 각각 메모리·디스크·네트워크 정렬이다.
기본 수집 간격은 10분이라 짧은 스파이크를 놓친다. /etc/default/atop 또는 /etc/sysconfig/atop 의 INTERVAL 을 60 정도로 줄이면 잡히지만 로그가 그만큼 커진다.
지금부터 일정 시간 동안 프로세스별로 찍어 파일에 남길 때 쓴다.
pidstat -h -u -r -d 1 60 > /tmp/pidstat.log