리눅스 운영 묶음 9개와 명령어 묶음 8개에서 다룬 명령을 한 장에 모았습니다. 파일·텍스트·권한·프로세스·자원·네트워크·서비스·패키지·로그·자바 진단 순서이고, 각 표는 "명령 · 뜻 · 예" 세 칸입니다. 옵션이 기억나지 않을 때 이 페이지에서 찾고 자세한 설명은 해당 레슨으로 갑니다.
| 상황 | 명령 |
|---|---|
| 어디에 있나 | pwd, ls -la, cd - |
| 파일 찾기 | find . -name '*.log' -mtime +7 |
| 내용 찾기 | grep -rn 'ERROR' logs/ |
| 큰 파일 | du -sh */ | sort -rh | head |
| 디스크 | df -h |
| 프로세스 | ps aux --sort=-%mem | head |
| 실시간 | top, top -H -p PID |
| 포트 | ss -ltnp |
| 연결 확인 | curl -s -o /dev/null -w '%{http_code}' URL |
| 서비스 | systemctl status myapp |
| 로그 | journalctl -u myapp -f |
| 권한 | chmod 750, chown app:app |
| 압축 | tar czf x.tgz dir, tar xzf x.tgz -C dst |
| 복사 | scp f host:/tmp/, rsync -avz src/ host:/dst/ |
| 자바 | jps -l, jstack PID, jmap -histo:live PID |
| 명령 | 뜻 | 예 |
|---|---|---|
pwd |
현재 경로 | |
cd - |
직전 폴더 | |
ls -la |
숨김 포함 상세 | ls -lt | head 최신순 |
ls -lh |
사람이 읽는 크기 | |
mkdir -p |
중간 폴더까지 | mkdir -p a/b/c |
touch |
빈 파일·시각 갱신 | |
cp -r |
폴더 복사 | cp -rp src dst 권한 유지 |
mv |
이동·이름 변경 | mv -n 덮어쓰기 금지 |
rm -rf |
폴더 삭제, 복구 불가 | 먼저 ls |
rmdir |
빈 폴더만 | |
ln -sfn |
심볼릭 링크 교체 | ln -sfn rel/v2 current |
realpath |
절대 경로 | |
stat -c '%s %A' |
크기·권한 | |
file |
종류·인코딩 | file x.sh CRLF 확인 |
find . -name '*.log' -size +100M # 이름 + 크기
find . -type f -mtime +30 -print # 30일 넘음, 먼저 보기
find . -type f -mtime +30 -delete # 같은 조건으로 삭제
find . -name '*.log' -exec gzip {} + # 찾은 것에 명령
find . -name '*.log' -print0 | xargs -0 grep -c ERROR # 공백 안전
du -xh --max-depth=1 / | sort -rh | head # 용량 범인| 명령 | 뜻 | 예 |
|---|---|---|
cat -A |
탭·CR 표시 | ^I 탭 ^M CR |
head -n 20 / tail -n 20 |
앞·뒤 | tail -f 따라가기 |
less |
페이지 보기 | /검색 n G q F |
wc -l |
줄 수 | wc -c 바이트 |
sort -n -r -k2 -t, |
숫자·역순·열·구분자 | sort -u 중복 제거 |
uniq -c |
연속 중복 세기 | 항상 sort 뒤 |
cut -d' ' -f2 |
열 자르기 | cut -c1-10 글자 |
tr 'a-z' 'A-Z' |
글자 변환 | tr -d '\r' CR 제거 |
diff -u a b |
차이 | - 원본 + 변경 |
comm -12 |
공통 줄 | 정렬된 입력 |
column -t |
열 맞춤 | |
sed -i 's/\r$//' |
CRLF 고치기 |
grep -n ERROR app.log # 줄 번호
grep -c ERROR app.log # 개수
grep -v INFO app.log # 제외
grep -A5 'Exception' app.log # 뒤 5줄 (스택)
grep -E 'ERROR|WARN' app.log # 정규식 또는
grep -oE '/api/[a-z]+' app.log | sort | uniq -c | sort -rn # 빈도
grep -rl 'db-dev' conf/ # 파일 이름만
grep -r --include='*.log' -c ERROR . # 확장자 제한
zgrep ERROR app.log.1.gz # 압축 파일
sed -n '10,20p' f # 줄 범위
sed -n '/ERROR/p' f # 패턴 줄
sed 's/old/new/g' f # 치환 (화면만)
sed -i.bak 's/^server.port=.*/server.port=9090/' f # 파일 수정 + 백업
sed '/^#/d' f # 주석 삭제
sed -E 's/^([0-9-]+) ([0-9:]+) /\2 /' f # 그룹 재사용
awk '{print $3}' f # 3열
awk -F= '{print $1}' f # 구분자 =
awk '$3=="ERROR"{print $2}' f # 조건
awk '{s+=$NF+0} END{print s/NR}' f # 평균 ($NF+0 숫자 변환)
awk '{c[$6]++} END{for(k in c) print c[k], k}' f | sort -rn # group by| 키 | 동작 |
|---|---|
i / Esc |
입력 / 명령 모드 |
:w :q :wq :q! |
저장·나가기·저장 후·버리고 |
dd yy p u |
줄 삭제·복사·붙여넣기·되돌리기 |
x o A |
글자 삭제·아래 줄 입력·줄 끝 입력 |
gg G :10 |
처음·끝·10번 줄 |
/단어 n |
검색·다음 |
:%s/old/new/g |
전체 치환 (gc 확인) |
:set nu |
줄 번호 |
| 명령 | 뜻 | 예 |
|---|---|---|
id, whoami, groups |
나는 누구 | |
chmod 750 d |
숫자 권한 | 644 파일, 755 폴더, 600 비밀 |
chmod u+x f |
기호 권한 | go-w, a=r, -R |
umask 077 |
새 파일 기본 | 022 기본 |
chown app:app -R d |
소유자 | root 필요 |
useradd -r -s /sbin/nologin app |
서비스 계정 | -m 홈 폴더 |
usermod -aG wheel kim |
그룹 추가 | -a 필수 |
passwd kim |
비밀번호 | |
getent passwd app |
계정 정보 | getent group g |
sudo 명령 |
root 로 한 명령 | sudo -u app cmd |
sudo -l |
허용 목록 | visudo 편집 |
chmod g+s d / +t |
setgid / sticky | 공유 폴더 / /tmp |
-rwxr-x--- = 750 r=4 w=2 x=1 소유자 그룹 기타
폴더의 x = 들어가기. x 없으면 안 파일 접근 불가| 명령 | 뜻 | 예 |
|---|---|---|
ps -ef |
전체, PPID | ps -ef --forest 트리 |
ps aux --sort=-%cpu |
CPU 순 | --sort=-rss 메모리 |
ps -o pid,etime,cmd -p PID |
열 선택 | |
pgrep -f 'app.jar' |
PID 찾기 | ps | grep '[a]pp' |
jps -l |
자바 프로세스 | |
kill PID |
TERM 15 | 먼저 |
kill -9 PID |
KILL 9 | 마지막 수단 |
kill -0 PID |
생존 확인 | |
pkill -f 'app.jar' |
이름으로 | 범위 주의 |
nohup cmd & |
터미널 무관 | disown |
jobs bg fg Ctrl+Z |
작업 제어 | kill %1 |
nice -n 10 cmd |
낮은 우선순위 | ionice -c3 |
$ $! $? |
내 PID·백그라운드 PID·종료 코드 |
| 종료 코드 | 뜻 |
|---|---|
| 0 | 정상 |
| 1 | 앱 에러 |
| 2 | 사용법 오류 |
| 126 / 127 | 실행 불가 / 명령 없음 |
| 137 | 128+9 KILL (OOM killer) |
| 143 | 128+15 TERM (정상 정지) |
| 명령 | 뜻 | 볼 것 |
|---|---|---|
top |
실시간 | load, us wa, avail |
top -b -n 1 | head -n 15 |
한 화면 | 스크립트용 |
top -H -p PID |
스레드별 | TID → printf '%x' |
uptime |
load average | nproc 과 비교 |
free -m |
메모리 | available, Swap used |
vmstat 1 5 |
흐름 | r so wa |
iostat -x 1 3 |
디스크 I/O | %util await |
df -h / df -i |
파티션 / inode | Use% |
du -sh */ |
폴더별 | sort -rh |
lsof -p PID |
열린 파일 | lsof +L1 삭제된 열린 파일 |
lsof -i :8080 |
포트 사용 프로세스 | |
ls /proc/PID/fd | wc -l |
FD 수 | /proc/PID/limits |
: > file |
열린 로그 비우기 | rm 대신 |
| 명령 | 뜻 | 예 |
|---|---|---|
ip -br addr |
내 IP | hostname -I |
ip route |
게이트웨이 | default via |
ss -ltnp |
듣는 포트 | ss -tnp 연결 |
ss -s |
요약 | TIME-WAIT |
ping -c 3 h |
ICMP | 막힌 망 많음 |
nc -zv h 1521 |
포트 열림 | timeout 3 bash -c '</dev/tcp/h/1521' |
getent hosts h |
이름 풀기 | dig +short h |
traceroute -n h |
경로 | mtr -n h |
scp -P 2222 f h:/tmp/ |
복사 | -r 폴더 |
rsync -avz src/ h:/dst/ |
동기화 | -n 미리, --delete 주의 |
ssh h 'cmd' |
원격 명령 | -L 8080:localhost:8080 터널 |
ssh-keygen -t ed25519 |
키 | ssh-copy-id h |
firewall-cmd --add-port=8080/tcp --permanent |
방화벽 | --reload 필수 |
tcpdump -i any port 8080 -c 10 |
패킷 | -c 필수 |
curl -s URL # 본문
curl -s -o /dev/null -w '%{http_code}\n' URL # 코드만
curl -sI URL # 헤더만
curl -sf -m 5 URL # 실패 시 종료 코드 (7 거부, 22 HTTP, 28 타임아웃)
curl -s -X POST -H 'Content-Type: application/json' -d '{"id":1}' URL
curl -s -o /dev/null -w 'connect=%{time_connect} first=%{time_starttransfer}\n' URL
export http_proxy=http://proxy:3128 no_proxy=localhost,127.0.0.1,.corp
java -Dhttp.proxyHost=proxy -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts='localhost|*.corp' -jar app.jar| 명령 | 뜻 |
|---|---|
systemctl daemon-reload |
유닛 파일 다시 읽기 (수정 후 필수) |
systemctl start/stop/restart myapp |
제어 |
systemctl status myapp |
상태·PID·최근 로그 |
systemctl enable --now myapp |
부팅 시작 + 지금 시작 |
systemctl is-active myapp |
스크립트용 |
systemctl list-units --type=service --state=running |
실행 중 목록 |
systemctl reset-failed myapp |
재시작 상한 초기화 |
journalctl -u myapp -f |
실시간 로그 |
journalctl -u myapp -n 100 --since today |
최근·기간 |
journalctl -k | grep -i oom |
커널 OOM |
systemd-analyze verify x.service |
유닛 문법 검사 |
[Unit]
Description=MyApp
After=network-online.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=-/opt/myapp/conf/env
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/myapp/current/app.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target| 명령 | 뜻 |
|---|---|
crontab -e / crontab -l |
내 예약 편집 / 목록 |
*/5 * * * * /opt/app/chk.sh >> /var/log/chk.log 2>&1 |
5분마다, 출력은 파일로 |
0 3 * * 1-5 /opt/app/backup.sh |
평일 03:00 |
@daily @reboot |
매일 자정 / 부팅 때 |
at 23:00 -f job.sh |
한 번만 예약 |
systemctl list-timers |
systemd 타이머 목록 |
flock -n /tmp/job.lock cmd |
겹침 실행 방지 |
ln -sfn release-3 current |
링크 대상 바꾸기 (배포 전환) |
readlink -f current |
링크가 가리키는 실제 경로 |
cron 은 PATH 가 짧으니 명령은 절대 경로로 씁니다. 자세한 사용법은 리눅스 명령어 10 에 있습니다.
| 명령 | 뜻 |
|---|---|
hostnamectl, uname -r -m, nproc |
서버 식별 |
cat /etc/os-release |
OS 버전 |
date +%F, date +%Y%m%d_%H%M%S |
날짜 형식 |
date -d '-7 day' +%F |
날짜 계산 |
timedatectl |
시간대·NTP |
dnf install -y pkg / remove |
설치·삭제 |
dnf update --security |
보안 패치 |
dnf provides */ss |
명령의 패키지 |
dnf history |
이력·undo |
rpm -qa | grep java |
설치 목록 |
rpm -ql pkg / rpm -qf /path |
파일 목록 / 파일의 패키지 |
dnf install ./x.rpm |
파일 설치 (의존성 저장소) |
dnf download --resolve pkg |
폐쇄망 반입용 |
last reboot, who |
재부팅 이력·접속자 |
shutdown -r +10 |
10분 뒤 재부팅 |
| 명령 | 뜻 |
|---|---|
tar czf x.tgz dir |
묶기+gzip |
tar tzf x.tgz |
목록 (풀기 전 확인) |
tar xzf x.tgz -C dst |
지정 폴더에 풀기 |
tar czf x.tgz -C /opt myapp |
상대 경로로 묶기 |
tar czf x.tgz --exclude='*.log' dir |
제외 |
tar xzOf x.tgz path/file |
파일 하나 화면에 |
gzip -k f / gunzip f.gz |
압축·해제 (-k 원본 유지) |
zcat f.gz | head |
풀지 않고 읽기 |
zip -r x.zip dir / unzip -l x.zip |
Windows 호환 |
unzip -p app.jar META-INF/MANIFEST.MF |
jar 안 파일 |
sha256sum f > f.sha256 / sha256sum -c f.sha256 |
체크섬 |
split -b 500m f part_ / cat part_* > f |
분할·합치기 |
| 항목 | 명령·설정 |
|---|---|
| 응급 | df -h → du -xh --max-depth=2 / → lsof +L1 → : > big.log |
| 오래된 로그 | find logs -name '*.log' -mtime +30 -delete |
| 압축 보관 | find logs -name '*.log' -mtime +7 ! -name '*.gz' -exec gzip {} + |
| 힙 덤프 정리 | find logs -name '*.hprof' -mtime +7 -delete |
| logrotate 검사 | logrotate -d /etc/logrotate.d/myapp |
| 저널 상한 | journalctl --disk-usage, --vacuum-size=1G |
# /etc/logrotate.d/myapp (자바 stdout·catalina.out 은 copytruncate)
/opt/myapp/logs/stdout.log {
daily
rotate 14
maxsize 200M
compress
delaycompress
copytruncate
missingok
notifempty
dateext
su myapp myapp
}# cron: 분 시 일 월 요일 (cron.d 는 사용자 칸 추가). 상단 PATH 필수, 출력은 파일로
PATH=/usr/local/bin:/usr/bin:/bin
10 3 * * * myapp find /opt/myapp/logs -name 'app.*.log*' -mtime +30 -delete >> /opt/myapp/logs/cleanup.log 2>&1
*/5 * * * * root /opt/myapp/bin/check.sh
0 9 * * 1-5 kim /opt/tools/report.sh # 평일 09:00| 명령 | 뜻 |
|---|---|
java -Xms1g -Xmx1g -Duser.timezone=Asia/Seoul -jar app.jar |
기본 옵션 |
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ |
OOM 덤프 |
-Djava.security.egd=file:/dev/./urandom |
시작 지연 방지 |
-Dspring.profiles.active=prod |
프로필 |
jps -l |
자바 PID |
jstack PID > td.txt |
스레드 덤프 (5초 간격 3장) |
jcmd PID Thread.print |
같은 것 |
jstat -gcutil PID 1000 5 |
GC 사용률 (O, FGC) |
jmap -histo:live PID | head -n 20 |
힙 상위 클래스 |
jcmd PID GC.heap_dump /path/h.hprof |
힙 덤프 (앱 멈춤) |
jcmd PID VM.flags |
적용된 옵션 |
sudo -u myapp jstack PID |
앱 계정으로 |
dmesg -T | grep -i 'killed process' |
커널 OOM 증거 |
grep -oE 'Thread.State: [A-Z_]+' td.txt | sort | uniq -c | sort -rn # 상태 집계
grep -B20 'locked <0x...>' td.txt | grep '^"' # 잠금 잡은 스레드
grep -A10 "nid=0x$(printf '%x' TID)" td.txt # top -H TID → 스택#!/usr/bin/env bash
set -euo pipefail
WORK=$(mktemp -d); trap 'rm -rf "$WORK"' EXIT
log() { printf '%s [%s] %s\n' "$(date '+%F %T')" "$1" "$2"; }
die() { log ERROR "$1" >&2; exit "${2:-1}"; }
DIR=${1:?사용: $0 <폴더>}
[ -d "$DIR" ] || die "폴더 없음: $DIR"
LOCK=/var/run/job.lock; mkdir "$LOCK" 2>/dev/null || die "이미 실행 중"; trap 'rm -rf "$LOCK" "$WORK"' EXIT
for f in "$DIR"/*.log; do [ -e "$f" ] || continue; gzip "$f"; done
while IFS= read -r line; do echo "$line"; done < file| 문법 | 뜻 |
|---|---|
${v:-기본} ${v:?메시지} |
기본값 · 필수 |
${p##*/} ${p%/*} ${p%.jar} |
basename · dirname · 확장자 제거 |
[ -f f ] [ -d d ] [ -z s ] [ n -gt 3 ] |
파일·폴더·빈 문자열·숫자 |
[[ $f == *.log ]] |
패턴 |
$( ) $(( )) |
명령 치환 · 산술 |
cmd || true |
실패 무시 |
set +e; cmd; rc=$?; set -e |
종료 코드 잡기 |
trap 'cmd' EXIT/ERR/INT |
정리·에러 줄·중단 |
| 키·표기 | 동작 |
|---|---|
Ctrl+R |
히스토리 검색 |
!! sudo !! !$ |
직전 명령 · sudo 로 · 마지막 인자 |
Ctrl+A/E Ctrl+U/K Ctrl+W |
줄 처음/끝 · 앞/뒤 삭제 · 단어 삭제 |
Ctrl+L Ctrl+C Ctrl+Z Ctrl+D |
화면 지움 · 중단 · 멈춤 · 입력 끝 |
Ctrl+S → Ctrl+Q |
화면 멈춤 풀기 |
Tab Tab Tab |
자동 완성 · 후보 |
alias ll='ls -la' |
별칭 (~/.bashrc) |
{1..5} {a,b} f{,.bak} |
중괄호 확장 |
* ? [1-3] |
글로브 |
tee f |
화면+파일 |
xargs -0 xargs -I{} |
인자 넘기기 |
watch -n 2 'cmd' |
반복 실행 |
tmux new -s x / Ctrl+B d / tmux attach -t x |
세션 유지 |
PS1='[\u@\h \W]\$ ' |
프롬프트 |
상황별로 명령을 치는 순서입니다. 각 단계가 통과해야 다음으로 갑니다.
hostnamectl → nproc free -m df -h → timedatectl → ss -ltnpsystemctl status → journalctl -u -n 50 → sudo -u app java -jar 로 직접 실행ss -ltnp → curl localhost → firewall-cmd --list-all → 원격에서 nc -zv → getent hostsuptime → top 의 us/wa → top -H -p → jstack 3장 → jstat -gcutildf -h → du -xh --max-depth=2 → lsof +L1 → : > log → find -mtime +N -deletedmesg -T | grep -i killed → .hprof 유무 → 앱 로그releases/ 복사 → ln -sfn current → restart → 헬스 체크 → 실패 시 rollbackcp f{,.bak} → 수정 → diff → 적용 (nginx -t && reload, daemon-reload)find ... -print 로 확인 → 같은 조건으로 -deletetmux 안에서 시작 → nice ionice → 출력은 로그 파일로