개발자를 위한 리눅스·맥 명령어 실전 가이드 | 네트워크·파일·프로세스·디버깅
이 글의 핵심
개발 현장에서 매일 쓰는 리눅스·맥 터미널 명령어를 실전 예제로 정리합니다. 네트워크 디버깅, 파일 조작, 프로세스 관리, 로그 분석까지 복사해서 바로 쓸 수 있는 치트시트입니다.
들어가며
“서버가 응답이 없어요”, “로그 어디서 보죠?”, “포트가 이미 사용 중이래요” — 개발하다 보면 터미널 명령어로 문제를 빠르게 해결해야 할 때가 많습니다.
이 글은 개발 현장에서 실제로 자주 쓰는 리눅스·맥 명령어를 실전 예제로 정리한 치트시트입니다. 복사해서 바로 쓸 수 있도록 구성했습니다.
대상 독자:
- 백엔드·DevOps 개발자
- 서버 배포·디버깅하는 프론트엔드 개발자
- 리눅스 터미널 입문자
이 글을 읽으면:
- 네트워크 문제를 빠르게 진단할 수 있습니다.
- 로그 파일에서 에러를 찾을 수 있습니다.
- 프로세스·포트·디스크를 관리할 수 있습니다.
목차
- 디렉토리 탐색 및 파일 관리
- 파일 내용 보기 및 검색
- 네트워크 디버깅
- 프로세스 관리
- 로그 분석 및 텍스트 처리
- 디스크 및 시스템 정보
- 권한 및 소유자 관리
- 압축 및 아카이브
- 개발 환경 설정
- 실전 시나리오별 명령어 조합
1. 디렉토리 탐색 및 파일 관리
기본 탐색
# 현재 디렉토리 확인
pwd
# 디렉토리 이동
cd /var/log
cd ~ # 홈 디렉토리
cd - # 이전 디렉토리
cd .. # 상위 디렉토리
# 디렉토리 내용 보기
ls # 기본
ls -la # 숨김 파일 포함, 상세 정보
ls -lh # 사람이 읽기 쉬운 크기 (KB, MB)
ls -lt # 최신 파일 먼저
ls -lS # 큰 파일 먼저
ls -R # 하위 디렉토리까지 재귀
# 트리 구조로 보기
tree # 전체 트리
tree -L 2 # 2단계까지만
tree -d # 디렉토리만
tree -I 'node_modules|.git' # 제외
디렉토리 생성 및 삭제
# 디렉토리 생성
mkdir mydir
mkdir -p parent/child/grandchild # 중간 디렉토리 자동 생성
# 디렉토리 삭제
rmdir mydir # 빈 디렉토리만
rm -r mydir # 내용 포함 삭제
rm -rf mydir # 강제 삭제 (주의!)
# 안전한 삭제 (확인 후 삭제)
rm -ri mydir # 각 파일마다 확인
파일 복사 및 이동
# 파일 복사
cp file.txt backup.txt
cp -r src/ dest/ # 디렉토리 복사
cp -p file.txt backup.txt # 권한·타임스탬프 유지
cp -u src/* dest/ # 최신 파일만 복사
# 파일 이동 (이름 변경)
mv old.txt new.txt
mv file.txt /path/to/dest/
mv *.log logs/ # 여러 파일 이동
# 심볼릭 링크
ln -s /path/to/original link_name
ls -l link_name # 링크 확인
파일 찾기
# 이름으로 찾기
find . -name "*.log"
find /var -name "error.log"
find . -iname "*.TXT" # 대소문자 무시
# 타입으로 찾기
find . -type f # 파일만
find . -type d # 디렉토리만
find . -type l # 심볼릭 링크만
# 크기로 찾기
find . -size +100M # 100MB 이상
find . -size -1k # 1KB 이하
find /tmp -size +1G -delete # 1GB 이상 파일 삭제
# 시간으로 찾기
find . -mtime -7 # 최근 7일 이내 수정
find . -mtime +30 # 30일 이상 수정 안 됨
find . -mmin -60 # 최근 60분 이내
# 찾아서 실행
find . -name "*.tmp" -delete
find . -name "*.js" -exec grep "TODO" {} \;
find . -type f -exec chmod 644 {} \;
2. 파일 내용 보기 및 검색
파일 내용 출력
# 전체 내용
cat file.txt
cat file1.txt file2.txt # 여러 파일 연결
# 줄 번호 포함
cat -n file.txt
nl file.txt
# 처음 N줄
head file.txt # 기본 10줄
head -n 20 file.txt # 20줄
head -c 100 file.txt # 처음 100바이트
# 마지막 N줄
tail file.txt # 기본 10줄
tail -n 50 file.txt # 50줄
tail -f /var/log/app.log # 실시간 모니터링 (로그)
tail -f -n 100 app.log # 최근 100줄부터 실시간
# 페이지 단위로 보기
less file.txt # 스크롤 가능 (q로 종료)
more file.txt # 한 페이지씩
grep: 텍스트 검색
# 기본 검색
grep "error" app.log
grep -i "error" app.log # 대소문자 무시
grep -v "debug" app.log # 제외 (debug 없는 줄)
grep -n "error" app.log # 줄 번호 포함
grep -c "error" app.log # 매칭 줄 개수
# 여러 파일 검색
grep "TODO" *.js
grep -r "import" src/ # 재귀 검색
grep -l "error" *.log # 파일명만 출력
# 정규표현식
grep "^Error" app.log # Error로 시작
grep "failed$" app.log # failed로 끝남
grep "error\|warning" app.log # OR 검색
grep -E "error|warning" app.log # 확장 정규식
# 컨텍스트 포함
grep -A 5 "error" app.log # 매칭 후 5줄
grep -B 3 "error" app.log # 매칭 전 3줄
grep -C 2 "error" app.log # 전후 2줄
# 실전 예제
grep -i "exception" *.log | grep -v "test" # 파이프 조합
awk: 텍스트 처리
# 특정 컬럼 출력
awk '{print $1}' file.txt # 첫 번째 컬럼
awk '{print $1, $3}' file.txt # 1, 3번째 컬럼
ps aux | awk '{print $2, $11}' # PID와 명령어
# 조건 필터
awk '$3 > 100' file.txt # 3번째 컬럼이 100 이상
awk '/error/ {print $0}' app.log # error 포함 줄
# 합계 계산
awk '{sum += $1} END {print sum}' numbers.txt
du -sh */ | awk '{sum += $1} END {print sum}'
# 구분자 변경
awk -F: '{print $1}' /etc/passwd # : 구분자
awk -F',' '{print $2}' data.csv # CSV
# 실전 예제: 메모리 사용량 상위 5개
ps aux | awk '{print $4, $11}' | sort -rn | head -5
# 로그에서 응답 시간 평균
awk '/response_time/ {sum += $5; count++} END {print sum/count}' app.log
sed: 텍스트 치환
# 기본 치환
sed 's/old/new/' file.txt # 첫 번째만
sed 's/old/new/g' file.txt # 모두
sed -i 's/old/new/g' file.txt # 파일 직접 수정 (리눅스)
sed -i '' 's/old/new/g' file.txt # 맥
# 특정 줄만
sed '3s/old/new/' file.txt # 3번째 줄만
sed '1,5s/old/new/' file.txt # 1~5번째 줄
# 줄 삭제
sed '3d' file.txt # 3번째 줄 삭제
sed '/pattern/d' file.txt # 패턴 매칭 줄 삭제
# 실전 예제: 설정 파일 수정
sed -i 's/DEBUG=true/DEBUG=false/g' .env
sed -i 's/localhost/0.0.0.0/g' config.yaml
3. 네트워크 디버깅
IP 및 네트워크 인터페이스 확인
# IP 주소 확인
ifconfig # 맥, 구형 리눅스
ip addr show # 최신 리눅스
ip a # 축약형
# 특정 인터페이스만
ifconfig en0 # 맥
ip addr show eth0 # 리눅스
# 외부 IP 확인
curl ifconfig.me
curl ipinfo.io/ip
dig +short myip.opendns.com @resolver1.opendns.com
# 라우팅 테이블
route -n # 리눅스
netstat -rn # 맥
ip route show # 리눅스
포트 및 연결 확인
# 열린 포트 확인
netstat -tuln # 리눅스 (TCP/UDP, listening, numeric)
netstat -an | grep LISTEN # 맥
lsof -i -P -n # 모든 네트워크 연결
lsof -i :8080 # 특정 포트
# 프로세스별 포트 확인
lsof -i -P -n | grep LISTEN
sudo lsof -iTCP -sTCP:LISTEN -n -P
# 특정 프로세스의 포트
lsof -p 1234 # PID 1234
lsof -c node # node 프로세스
# 포트 사용 중인 프로세스 죽이기
lsof -ti:8080 | xargs kill
lsof -ti:8080 | xargs kill -9 # 강제 종료
# ss (최신 리눅스, netstat 대체)
ss -tuln # 열린 포트
ss -tunp # 프로세스 포함
ss -s # 통계
연결 테스트
# 핑 테스트
ping google.com
ping -c 4 8.8.8.8 # 4번만
# 포트 연결 테스트
telnet example.com 80
nc -zv example.com 80 # netcat
curl -I https://example.com # HTTP 헤더만
# 경로 추적
traceroute google.com
traceroute -n google.com # IP만 (DNS 생략)
mtr google.com # 실시간 traceroute
# DNS 조회
nslookup example.com
dig example.com
dig example.com +short # IP만
host example.com
curl: HTTP 요청
# GET 요청
curl https://api.example.com/users
curl -i https://example.com # 헤더 포함
curl -v https://example.com # 상세 정보
# POST 요청
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"[email protected]"}'
# 파일 업로드
curl -F "[email protected]" https://api.example.com/upload
# 인증
curl -u user:pass https://api.example.com
curl -H "Authorization: Bearer TOKEN" https://api.example.com
# 응답 저장
curl -o output.html https://example.com
curl -O https://example.com/file.zip # 원본 파일명
# 타임아웃 설정
curl --connect-timeout 5 --max-time 10 https://example.com
# 실전 예제: API 테스트
curl -X POST http://localhost:3000/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"secret"}' \
-w "\nStatus: %{http_code}\nTime: %{time_total}s\n"
wget: 파일 다운로드
# 파일 다운로드
wget https://example.com/file.zip
wget -O custom_name.zip https://example.com/file.zip
# 재시도 및 백그라운드
wget -c https://example.com/large.iso # 이어받기
wget -b https://example.com/file.zip # 백그라운드
# 여러 파일
wget -i urls.txt # 파일에서 URL 읽기
# 웹사이트 전체 다운로드
wget -r -np -k https://example.com/docs/
4. 프로세스 관리
프로세스 확인
# 모든 프로세스
ps aux # BSD 스타일
ps -ef # System V 스타일
# 특정 프로세스 검색
ps aux | grep node
pgrep node # PID만
pgrep -l node # PID와 이름
# 프로세스 트리
ps auxf # 리눅스
pstree # 트리 구조
pstree -p # PID 포함
# 실시간 모니터링
top # 기본
top -o cpu # CPU 순 정렬 (맥)
htop # 개선된 top (설치 필요)
# 특정 프로세스 모니터링
top -p 1234 # PID 1234만 (리눅스)
프로세스 종료
# 프로세스 종료
kill 1234 # PID로 종료 (SIGTERM)
kill -9 1234 # 강제 종료 (SIGKILL)
killall node # 이름으로 모두 종료
pkill node # 패턴으로 종료
# 포트로 프로세스 찾아 종료
lsof -ti:8080 | xargs kill
kill $(lsof -ti:8080)
# 실전 예제: 좀비 프로세스 정리
ps aux | grep defunct | awk '{print $2}' | xargs kill -9
백그라운드 실행
# 백그라운드 실행
npm start &
nohup npm start & # 터미널 종료 후에도 실행
nohup npm start > app.log 2>&1 & # 로그 파일로
# 백그라운드 작업 확인
jobs
jobs -l # PID 포함
# 포그라운드로 가져오기
fg %1 # 작업 번호 1
# 실행 중인 프로세스 일시정지
Ctrl+Z
bg # 백그라운드로 재개
5. 로그 분석 및 텍스트 처리
실시간 로그 모니터링
# 실시간 로그
tail -f /var/log/app.log
tail -f -n 100 app.log # 최근 100줄부터
# 여러 파일 동시 모니터링
tail -f app.log error.log
multitail app.log error.log # 분할 화면 (설치 필요)
# 패턴 필터링하며 실시간
tail -f app.log | grep "ERROR"
tail -f app.log | grep --line-buffered "ERROR" # 즉시 출력
로그 분석
# 에러 개수
grep -c "ERROR" app.log
# 시간대별 에러
grep "2026-04-01 14:" app.log | grep "ERROR"
# 상위 에러 유형
grep "ERROR" app.log | awk '{print $5}' | sort | uniq -c | sort -rn
# IP별 요청 수
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 응답 시간 분석
awk '{sum += $10; count++} END {print "Avg:", sum/count, "ms"}' app.log
# 특정 시간대 추출
sed -n '/2026-04-01 14:00/,/2026-04-01 15:00/p' app.log
텍스트 정렬 및 중복 제거
# 정렬
sort file.txt
sort -r file.txt # 역순
sort -n file.txt # 숫자 정렬
sort -k 2 file.txt # 2번째 컬럼 기준
# 중복 제거
sort file.txt | uniq
sort file.txt | uniq -c # 개수 포함
sort file.txt | uniq -d # 중복만
# 실전 예제: 접속 IP 상위 10개
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
wc: 단어·줄 개수
# 줄 개수
wc -l file.txt
cat file.txt | wc -l
# 단어 개수
wc -w file.txt
# 바이트 크기
wc -c file.txt
# 실전 예제
find . -name "*.js" | wc -l # JS 파일 개수
grep "ERROR" app.log | wc -l # 에러 개수
6. 네트워크 디버깅 심화
패킷 캡처 및 분석
# tcpdump (root 권한 필요)
sudo tcpdump -i eth0 # eth0 인터페이스
sudo tcpdump -i any port 80 # 모든 인터페이스, 포트 80
sudo tcpdump -i eth0 -w capture.pcap # 파일로 저장
sudo tcpdump -r capture.pcap # 파일 읽기
# 특정 호스트
sudo tcpdump host 192.168.1.100
sudo tcpdump src 192.168.1.100
sudo tcpdump dst 192.168.1.100
# HTTP 요청 보기
sudo tcpdump -i any -A port 80 | grep "GET\|POST"
네트워크 속도 테스트
# 다운로드 속도
curl -o /dev/null -w "Speed: %{speed_download} bytes/sec\n" https://example.com/file.zip
# 대역폭 측정
iperf3 -c server_ip # 클라이언트
iperf3 -s # 서버
# ping 통계
ping -c 100 google.com | tail -3
방화벽 확인
# iptables (리눅스)
sudo iptables -L
sudo iptables -L -n -v # 상세
# ufw (Ubuntu)
sudo ufw status
sudo ufw allow 22/tcp
sudo ufw deny 80/tcp
# firewalld (CentOS/RHEL)
sudo firewall-cmd --list-all
sudo firewall-cmd --add-port=8080/tcp --permanent
7. 디스크 및 시스템 정보
디스크 사용량
# 전체 디스크
df -h # 사람이 읽기 쉽게
df -h / # 루트 파티션만
df -i # inode 사용량
# 디렉토리별 크기
du -sh * # 현재 디렉토리 하위
du -sh /var/log/* # 로그 디렉토리
du -h --max-depth=1 /var # 1단계까지
# 큰 디렉토리 찾기
du -sh * | sort -rh | head -10
du -ah / | sort -rh | head -20 # 파일 포함
# 실전 예제: 디스크 풀 때
df -h # 어느 파티션?
du -sh /var/log/* | sort -rh # 로그 확인
find /var/log -name "*.log" -mtime +30 -size +100M # 오래된 큰 로그
시스템 정보
# OS 정보
uname -a # 전체 정보
uname -r # 커널 버전
cat /etc/os-release # 리눅스 배포판
sw_vers # 맥 버전
# CPU 정보
lscpu # 리눅스
sysctl -n machdep.cpu.brand_string # 맥
cat /proc/cpuinfo # 리눅스
# 메모리 정보
free -h # 리눅스
vm_stat # 맥
cat /proc/meminfo # 리눅스
# 가동 시간
uptime
uptime -p # 사람이 읽기 쉽게
시스템 리소스 모니터링
# 실시간 리소스
top
htop # 개선된 버전
glances # 종합 모니터링
# I/O 모니터링
iostat # CPU·디스크 I/O
iostat -x 2 # 2초마다 상세
iotop # 프로세스별 I/O (root)
# 네트워크 I/O
iftop # 실시간 네트워크 (root)
nethogs # 프로세스별 네트워크
8. 권한 및 소유자 관리
권한 변경
# chmod: 권한 변경
chmod 755 script.sh # rwxr-xr-x
chmod +x script.sh # 실행 권한 추가
chmod -R 644 files/ # 재귀적으로
# 숫자 의미
# 4 = 읽기(r), 2 = 쓰기(w), 1 = 실행(x)
# 755 = rwxr-xr-x (소유자 7, 그룹 5, 기타 5)
# 644 = rw-r--r-- (소유자 6, 그룹 4, 기타 4)
# 실전 예제
chmod 600 ~/.ssh/id_rsa # SSH 키 권한
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
소유자 변경
# chown: 소유자 변경
sudo chown user file.txt
sudo chown user:group file.txt
sudo chown -R user:group dir/
# 실전 예제
sudo chown -R www-data:www-data /var/www/html
sudo chown -R $USER:$USER ~/project
권한 확인
# 상세 권한
ls -l file.txt
stat file.txt # 더 상세
# 실행 가능 파일 찾기
find . -type f -perm -111
find . -type f -executable
9. 압축 및 아카이브
tar: 압축·해제
# 압축
tar -czf archive.tar.gz dir/ # gzip
tar -cjf archive.tar.bz2 dir/ # bzip2
tar -cJf archive.tar.xz dir/ # xz (더 작음)
# 해제
tar -xzf archive.tar.gz
tar -xzf archive.tar.gz -C /path/to/dest # 특정 위치
# 내용 확인 (해제 안 함)
tar -tzf archive.tar.gz
tar -tzf archive.tar.gz | grep "file"
# 실전 예제: 백업
tar -czf backup-$(date +%Y%m%d).tar.gz ~/project
tar -czf - ~/project | ssh user@remote "cat > backup.tar.gz"
zip: 압축·해제
# 압축
zip archive.zip file1.txt file2.txt
zip -r archive.zip dir/ # 디렉토리
# 해제
unzip archive.zip
unzip archive.zip -d dest/ # 특정 위치
unzip -l archive.zip # 내용 확인
# 암호화
zip -e secure.zip file.txt
gzip, bzip2
# gzip
gzip file.txt # file.txt.gz 생성 (원본 삭제)
gzip -k file.txt # 원본 유지
gunzip file.txt.gz # 해제
# bzip2
bzip2 file.txt
bunzip2 file.txt.bz2
# 압축률 비교
gzip file.txt # 빠름, 보통 압축
bzip2 file.txt # 느림, 높은 압축
xz file.txt # 가장 느림, 최고 압축
10. 개발 환경 설정
환경 변수
# 환경 변수 확인
env # 모든 환경 변수
echo $PATH
echo $HOME
printenv PATH
# 환경 변수 설정
export API_KEY="secret"
export PATH="$PATH:/new/path"
# 영구 설정 (bash)
echo 'export API_KEY="secret"' >> ~/.bashrc
source ~/.bashrc
# 영구 설정 (zsh)
echo 'export API_KEY="secret"' >> ~/.zshrc
source ~/.zshrc
SSH
# SSH 접속
ssh user@hostname
ssh -p 2222 user@hostname # 포트 지정
ssh -i ~/.ssh/key.pem user@hostname # 키 파일
# SSH 키 생성
ssh-keygen -t ed25519 -C "[email protected]"
ssh-keygen -t rsa -b 4096
# 공개키 복사
ssh-copy-id user@hostname
cat ~/.ssh/id_rsa.pub | ssh user@hostname "cat >> ~/.ssh/authorized_keys"
# SSH 터널링
ssh -L 8080:localhost:80 user@remote # 로컬 포트 포워딩
ssh -R 8080:localhost:3000 user@remote # 리모트 포트 포워딩
# SCP: 파일 복사
scp file.txt user@remote:/path/
scp -r dir/ user@remote:/path/
scp user@remote:/path/file.txt ./
Git 관련 명령어
# 브랜치 정리
git branch -d old-branch
git branch -D force-delete
git remote prune origin # 삭제된 리모트 브랜치 정리
# 로그 한 줄로
git log --oneline -10
git log --graph --oneline --all
# 변경 사항 확인
git diff
git diff --staged
git diff HEAD~1 HEAD
# 실전 예제: 특정 파일 히스토리
git log -p -- path/to/file.txt
git log --follow -- file.txt # 이름 변경 추적
Docker 관련
# 컨테이너 관리
docker ps # 실행 중
docker ps -a # 모든 컨테이너
docker logs -f container_id # 로그 실시간
docker exec -it container_id bash # 컨테이너 접속
# 이미지 관리
docker images
docker rmi image_id
docker system prune -a # 미사용 정리
# 실전 예제: 디버깅
docker logs --tail 100 -f container_id
docker exec -it container_id sh -c "ps aux"
docker stats # 리소스 사용량
11. 실전 시나리오별 명령어 조합
시나리오 1: “포트 8080이 이미 사용 중”
# 1. 포트 사용 프로세스 확인
lsof -i :8080
# 또는
netstat -tuln | grep 8080
# 2. PID 확인 후 종료
kill $(lsof -ti:8080)
# 3. 재확인
lsof -i :8080
시나리오 2: “서버가 느려요”
# 1. CPU·메모리 확인
top
htop
# 2. 디스크 I/O 확인
iostat -x 2
# 3. 네트워크 확인
iftop
nethogs
# 4. 로그 확인
tail -f /var/log/app.log | grep "ERROR\|WARN"
# 5. 프로세스별 리소스
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10
시나리오 3: “디스크가 꽉 찼어요”
# 1. 디스크 사용량 확인
df -h
# 2. 큰 디렉토리 찾기
du -sh /* | sort -rh | head -10
du -sh /var/* | sort -rh
# 3. 큰 파일 찾기
find / -type f -size +1G 2>/dev/null
find /var/log -name "*.log" -size +100M
# 4. 오래된 로그 삭제
find /var/log -name "*.log" -mtime +30 -delete
find /tmp -mtime +7 -delete
# 5. Docker 정리 (개발 환경)
docker system prune -a
docker volume prune
시나리오 4: “API가 응답 안 해요”
# 1. 서비스 실행 확인
ps aux | grep node
systemctl status myapp # systemd
# 2. 포트 리스닝 확인
lsof -i :3000
netstat -tuln | grep 3000
# 3. 로컬 연결 테스트
curl http://localhost:3000/health
curl -v http://localhost:3000
# 4. 외부 연결 테스트
curl http://server-ip:3000
telnet server-ip 3000
# 5. 방화벽 확인
sudo iptables -L
sudo ufw status
# 6. 로그 확인
tail -f /var/log/app.log
journalctl -u myapp -f # systemd
시나리오 5: “특정 에러 로그만 추출”
# 1. 시간대별 에러
grep "2026-04-01 14:" app.log | grep "ERROR" > errors.txt
# 2. 에러 유형별 분류
grep "ERROR" app.log | awk '{print $5}' | sort | uniq -c | sort -rn
# 3. 특정 에러만
grep "NullPointerException" app.log > null_errors.txt
# 4. 컨텍스트 포함
grep -A 10 "ERROR" app.log > errors_with_context.txt
# 5. 여러 파일에서
grep -r "ERROR" /var/log/app/*.log | grep "database"
시나리오 6: “배포 스크립트 자동화”
#!/bin/bash
# deploy.sh
set -e # 에러 시 중단
echo "🚀 배포 시작..."
# 1. Git 최신 코드
git pull origin main
# 2. 의존성 설치
npm ci
# 3. 빌드
npm run build
# 4. 기존 프로세스 종료
pkill -f "node.*server.js" || true
# 5. 백업
tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz dist/
# 6. 새 프로세스 시작
nohup npm start > app.log 2>&1 &
# 7. 헬스 체크
sleep 5
curl -f http://localhost:3000/health || exit 1
echo "✅ 배포 완료"
시나리오 7: “로그 로테이션 수동”
# 1. 현재 로그 백업
cp app.log app.log.$(date +%Y%m%d)
# 2. 로그 비우기
> app.log
# 또는
truncate -s 0 app.log
# 3. 오래된 백업 삭제
find . -name "app.log.*" -mtime +30 -delete
# 4. 압축
gzip app.log.20260301
12. 고급 팁 및 트릭
파이프 조합
# 프로세스 메모리 사용량 상위 10개
ps aux | awk '{print $4, $11}' | sort -rn | head -10
# 접속 IP별 요청 수
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn
# 에러율 계산
total=$(wc -l < app.log)
errors=$(grep -c "ERROR" app.log)
echo "scale=2; $errors / $total * 100" | bc
# 디렉토리별 파일 개수
find . -type f | sed 's|/[^/]*$||' | sort | uniq -c | sort -rn
유용한 별칭 (alias)
# ~/.bashrc 또는 ~/.zshrc에 추가
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias ports='lsof -i -P -n | grep LISTEN'
alias myip='curl ifconfig.me'
alias serve='python3 -m http.server 8000'
# Git 별칭
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline -10'
# Docker 별칭
alias dps='docker ps'
alias dpa='docker ps -a'
alias di='docker images'
alias dlog='docker logs -f'
히스토리 활용
# 명령어 히스토리
history
history | grep "docker"
# 히스토리 재실행
!123 # 123번 명령어
!! # 직전 명령어
!$ # 직전 명령어의 마지막 인자
!* # 직전 명령어의 모든 인자
# 실전 예제
sudo !! # 직전 명령어를 sudo로
ls /var/log
cd !$ # cd /var/log
파일 비교
# diff: 파일 비교
diff file1.txt file2.txt
diff -u file1.txt file2.txt # unified 형식
diff -y file1.txt file2.txt # 나란히
# 디렉토리 비교
diff -r dir1/ dir2/
# 바이너리 비교
cmp file1.bin file2.bin
파일 검색 고급
# locate (DB 기반, 빠름)
locate file.txt
sudo updatedb # DB 업데이트
# which: 실행 파일 경로
which python
which -a python # 모든 경로
# whereis: 바이너리·소스·매뉴얼
whereis python
13. 자주 쓰는 단축키
터미널 단축키
Ctrl+C 현재 명령어 중단
Ctrl+Z 현재 프로세스 일시정지
Ctrl+D EOF (로그아웃)
Ctrl+L 화면 지우기 (clear)
Ctrl+A 줄 맨 앞으로
Ctrl+E 줄 맨 뒤로
Ctrl+U 커서 앞 전부 삭제
Ctrl+K 커서 뒤 전부 삭제
Ctrl+W 단어 하나 삭제
Ctrl+R 명령어 히스토리 검색
Ctrl+S 출력 일시정지
Ctrl+Q 출력 재개
커서 이동
Alt+B 단어 하나 뒤로
Alt+F 단어 하나 앞으로
Ctrl+XX 줄 맨 앞과 현재 위치 토글
14. 시스템 관리 (systemd)
서비스 관리
# 서비스 상태
systemctl status nginx
systemctl status myapp
# 서비스 시작·정지
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx # 설정만 리로드
# 부팅 시 자동 시작
sudo systemctl enable nginx
sudo systemctl disable nginx
# 로그 확인
journalctl -u nginx
journalctl -u nginx -f # 실시간
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since "2026-04-01 14:00"
서비스 파일 작성
# /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js App
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node server.js
Restart=always
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
# 서비스 등록
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
15. 성능 분석 및 디버깅
strace: 시스템 콜 추적
# 프로세스 추적
strace ls
strace -p 1234 # 실행 중인 프로세스
# 파일 I/O만
strace -e open,read,write ls
# 시간 측정
strace -c ls # 통계
strace -T ls # 각 호출 시간
# 실전 예제: 설정 파일 찾기
strace -e open myapp 2>&1 | grep "config"
ldd: 라이브러리 의존성
# 실행 파일 의존성
ldd /usr/bin/python3
ldd myapp
# 실전 예제: 누락된 라이브러리 찾기
ldd myapp | grep "not found"
네트워크 디버깅 고급
# 연결 상태별 개수
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c
# TIME_WAIT 많을 때
netstat -an | grep TIME_WAIT | wc -l
# 특정 IP 연결 수
netstat -an | grep 192.168.1.100 | wc -l
# 실전 예제: DDoS 의심 시
netstat -an | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
16. 자주 쓰는 원라이너 (One-liners)
파일 처리
# 빈 줄 제거
grep -v '^$' file.txt
# 중복 줄 제거
sort file.txt | uniq
# 파일 합치기
cat file1.txt file2.txt > merged.txt
# CSV 특정 컬럼
awk -F',' '{print $2}' data.csv
# JSON 파싱 (jq 필요)
curl https://api.example.com/users | jq '.[] | .name'
cat data.json | jq '.users[0].email'
시스템 모니터링
# CPU 사용률 상위 10개
ps aux | sort -rk 3 | head -10
# 메모리 사용률 상위 10개
ps aux | sort -rk 4 | head -10
# 디스크 사용률 80% 이상
df -h | awk '$5+0 > 80 {print $0}'
# 좀비 프로세스 찾기
ps aux | awk '$8=="Z" {print $0}'
네트워크
# 외부 IP
curl -s ifconfig.me
# 포트 스캔
nc -zv example.com 80-443
# DNS 전파 확인
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com
# 응답 시간 측정
time curl https://example.com > /dev/null
로그 분석
# 시간대별 요청 수
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c
# 상태 코드별 개수
awk '{print $9}' access.log | sort | uniq -c
# 느린 요청 찾기
awk '$10 > 1000 {print $0}' app.log # 1000ms 이상
# 에러 로그만 추출
grep -E "ERROR|FATAL" app.log > errors.txt
17. 맥 전용 명령어
맥 시스템 관리
# 앱 목록
ls /Applications
# Homebrew
brew install package
brew update
brew upgrade
brew list
brew search keyword
# 서비스 관리 (brew services)
brew services list
brew services start postgresql
brew services stop postgresql
# 맥 정보
sw_vers
system_profiler SPHardwareDataType
맥 네트워크
# 네트워크 인터페이스
networksetup -listallhardwareports
networksetup -getinfo Wi-Fi
# DNS 캐시 클리어
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# 열린 파일·포트
lsof -i -P -n | grep LISTEN
18. 리눅스 전용 명령어
패키지 관리
# Ubuntu/Debian (apt)
sudo apt update
sudo apt upgrade
sudo apt install package
sudo apt remove package
sudo apt autoremove
# CentOS/RHEL (yum/dnf)
sudo yum update
sudo yum install package
sudo dnf install package
# 패키지 검색
apt search keyword
yum search keyword
systemd 고급
# 실패한 서비스
systemctl --failed
# 부팅 시간 분석
systemd-analyze
systemd-analyze blame # 서비스별 시간
# 로그 크기 제한
journalctl --disk-usage
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M
19. 개발자 필수 도구
설치 권장 도구
# 리눅스
sudo apt install -y \
curl wget git vim \
htop tree ncdu \
net-tools dnsutils \
jq ripgrep fd-find \
tmux
# 맥
brew install \
curl wget git vim \
htop tree ncdu \
jq ripgrep fd \
tmux fzf bat
도구별 용도
| 도구 | 용도 | 예제 |
|---|---|---|
| ripgrep | 빠른 검색 | rg "error" src/ |
| fd | 빠른 파일 찾기 | fd "\.js$" |
| jq | JSON 파싱 | cat data.json | jq '.name' |
| bat | cat 개선 | bat file.txt |
| ncdu | 디스크 사용량 UI | ncdu /var |
| tmux | 터미널 멀티플렉서 | tmux new -s dev |
| fzf | 퍼지 파인더 | history | fzf |
ripgrep (rg) 예제
# grep보다 빠름
rg "error" src/
rg -i "error" # 대소문자 무시
rg -l "TODO" # 파일명만
rg -t js "import" # JS 파일만
rg "error" -g "*.log" # 로그 파일만
rg -A 5 "error" # 후 5줄
fd 예제
# find보다 빠르고 간단
fd "\.js$"
fd -e js # 확장자
fd -t f # 파일만
fd -t d # 디렉토리만
fd -H "\.env" # 숨김 파일 포함
fd -E node_modules # 제외
20. 보안 관련 명령어
SSH 보안
# SSH 로그인 시도 확인
sudo grep "Failed password" /var/log/auth.log
sudo grep "Accepted" /var/log/auth.log
# IP별 실패 횟수
sudo grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn
# 현재 SSH 세션
who
w
last # 로그인 히스토리
파일 무결성
# 체크섬
md5sum file.txt # 리눅스
md5 file.txt # 맥
shasum -a 256 file.txt # SHA-256
# 파일 비교
md5sum file1.txt file2.txt
열린 포트 스캔
# nmap (설치 필요)
nmap localhost
nmap -p 1-65535 localhost # 모든 포트
nmap -sV localhost # 서비스 버전
21. 실전 체크리스트
서버 배포 전 체크
# 1. 디스크 공간
df -h
# 2. 메모리
free -h
# 3. 포트 충돌
lsof -i :8080
# 4. 방화벽
sudo ufw status
# 5. 로그 로테이션 설정
ls -lh /var/log/*.log
# 6. 환경 변수
env | grep API_KEY
# 7. 권한
ls -l /var/www/html
장애 대응 체크
# 1. 서비스 상태
systemctl status myapp
# 2. 최근 로그
journalctl -u myapp -n 100
# 3. 리소스
top
df -h
# 4. 네트워크
netstat -tuln | grep LISTEN
curl http://localhost:3000/health
# 5. 프로세스
ps aux | grep myapp
22. 정리
카테고리별 핵심 명령어
| 카테고리 | 명령어 | 용도 |
|---|---|---|
| 디렉토리 | cd, pwd, ls, tree | 탐색 |
| 파일 | cat, less, head, tail | 내용 보기 |
| 검색 | grep, find, rg, fd | 파일·텍스트 찾기 |
| 텍스트 | awk, sed, cut, sort | 처리·변환 |
| 네트워크 | curl, netstat, lsof, ss | 연결·포트 |
| 프로세스 | ps, top, kill, htop | 관리·모니터링 |
| 디스크 | df, du, ncdu | 사용량 |
| 압축 | tar, gzip, zip | 아카이브 |
| 권한 | chmod, chown, sudo | 접근 제어 |
| 시스템 | systemctl, journalctl | 서비스 관리 |
자주 쓰는 조합 패턴
# 로그 실시간 에러 모니터링
tail -f app.log | grep --line-buffered "ERROR"
# 프로세스 메모리 사용량
ps aux | awk '{print $4, $11}' | sort -rn | head -10
# 포트 사용 프로세스 종료
kill $(lsof -ti:8080)
# 디스크 큰 파일 찾기
du -ah / 2>/dev/null | sort -rh | head -20
# 접속 IP 상위 10개
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
학습 팁
- man 페이지 활용:
man ls,man grep - tldr 설치: 간단한 예제 보기 (
npm install -g tldr) - 히스토리 검색:
Ctrl+R로 이전 명령어 빠르게 찾기 - 별칭 설정: 자주 쓰는 명령어는
~/.bashrc에 별칭 추가 - 스크립트 작성: 반복 작업은 쉘 스크립트로 자동화
23. 실전 예제: 문제 해결 시나리오
예제 1: Node.js 앱이 시작 안 됨
# 1. 포트 충돌 확인
lsof -i :3000
# 출력: node 1234 user ... *:3000 (LISTEN)
# 2. 프로세스 종료
kill 1234
# 3. 재시작
npm start
# 4. 로그 확인
tail -f logs/app.log
예제 2: 디스크 풀 때
# 1. 사용량 확인
df -h
# 출력: /dev/sda1 98% 사용
# 2. 큰 디렉토리 찾기
du -sh /* | sort -rh | head -5
# 출력: /var/log 15GB
# 3. 로그 확인
du -sh /var/log/* | sort -rh
# 출력: app.log 10GB
# 4. 오래된 로그 삭제
find /var/log -name "*.log" -mtime +7 -size +100M -delete
# 5. 재확인
df -h
예제 3: API 응답 느림
# 1. 프로세스 리소스 확인
top -p $(pgrep -d',' node)
# 2. 네트워크 연결 수
netstat -an | grep :3000 | grep ESTABLISHED | wc -l
# 3. 응답 시간 측정
time curl http://localhost:3000/api/users
# 4. 로그에서 느린 요청
awk '$10 > 1000 {print $0}' app.log
# 5. 데이터베이스 연결 확인
lsof -i :5432 # PostgreSQL
예제 4: 메모리 누수 의심
# 1. 메모리 사용량 추이
while true; do
ps aux | grep myapp | awk '{print $4, $6}'
sleep 60
done
# 2. 상세 메모리 정보
pmap 1234 # PID 1234
cat /proc/1234/status | grep VmRSS
# 3. 힙 프로파일링 (Node.js)
node --inspect server.js
# Chrome DevTools로 연결
# 4. 재시작 후 비교
systemctl restart myapp
24. 정리 및 다음 단계
핵심 요약
매일 쓰는 10개:
ls -lah— 파일 목록cd— 디렉토리 이동grep— 텍스트 검색tail -f— 로그 실시간ps aux | grep— 프로세스 찾기lsof -i— 포트 확인curl— HTTP 요청df -h— 디스크 사용량top— 리소스 모니터링systemctl status— 서비스 상태
문제 해결 흐름:
- 로그 확인:
tail -f,journalctl - 리소스 확인:
top,df,free - 네트워크 확인:
lsof,netstat,curl - 프로세스 확인:
ps,pgrep - 재시작:
systemctl restart
학습 자료
온라인 연습:
- explainshell.com — 명령어 분해 설명
- tldr.sh — 간단한 예제
- commandlinefu.com — 커뮤니티 원라이너
책:
- “The Linux Command Line” by William Shotts
- “Unix and Linux System Administration Handbook”
다음 단계
명령어에 익숙해지면:
- Git 기본 사용법
- Node.js 배포 가이드
- Cloudflare Pages 배포
- 개발 취업 실전 팁
실전 적용:
- 자주 쓰는 명령어 10개 선택
~/.bashrc에 별칭 추가- 배포 스크립트 작성
- 모니터링 대시보드 구축
자주 묻는 질문 (FAQ)
Q. 명령어를 외워야 하나요?
A. 자주 쓰는 10~20개만 외우고, 나머지는 필요할 때 찾아 쓰세요. man 명령어나 tldr로 빠르게 확인할 수 있습니다.
Q. 리눅스와 맥 명령어 차이는?
A. 대부분 동일하지만, GNU(리눅스)와 BSD(맥) 버전 차이가 있습니다. 예: sed -i (리눅스) vs sed -i '' (맥). 이 글에서는 공통 명령어를 우선 소개했습니다.
Q. Windows에서는 못 쓰나요?
A. WSL(Windows Subsystem for Linux), Git Bash, PowerShell 일부 명령어로 사용 가능합니다. 또는 Docker 컨테이너에서 리눅스 환경을 실행하세요.
한 줄 요약: 개발 현장에서 매일 쓰는 리눅스·맥 명령어를 실전 예제로 정리한 치트시트입니다.
관련 글:
- Git 기본 사용법
- Node.js 배포 가이드
- Cloudflare Pages 배포