개발자를 위한 리눅스·맥 명령어 실전 가이드 | 네트워크·파일·프로세스·디버깅

개발자를 위한 리눅스·맥 명령어 실전 가이드 | 네트워크·파일·프로세스·디버깅

이 글의 핵심

개발 현장에서 매일 쓰는 리눅스·맥 터미널 명령어를 실전 예제로 정리합니다. 네트워크 디버깅, 파일 조작, 프로세스 관리, 로그 분석까지 복사해서 바로 쓸 수 있는 치트시트입니다.

들어가며

“서버가 응답이 없어요”, “로그 어디서 보죠?”, “포트가 이미 사용 중이래요” — 개발하다 보면 터미널 명령어로 문제를 빠르게 해결해야 할 때가 많습니다.

이 글은 개발 현장에서 실제로 자주 쓰는 리눅스·맥 명령어실전 예제로 정리한 치트시트입니다. 복사해서 바로 쓸 수 있도록 구성했습니다.

대상 독자:

  • 백엔드·DevOps 개발자
  • 서버 배포·디버깅하는 프론트엔드 개발자
  • 리눅스 터미널 입문자

이 글을 읽으면:

  • 네트워크 문제를 빠르게 진단할 수 있습니다.
  • 로그 파일에서 에러를 찾을 수 있습니다.
  • 프로세스·포트·디스크를 관리할 수 있습니다.

목차

  1. 디렉토리 탐색 및 파일 관리
  2. 파일 내용 보기 및 검색
  3. 네트워크 디버깅
  4. 프로세스 관리
  5. 로그 분석 및 텍스트 처리
  6. 디스크 및 시스템 정보
  7. 권한 및 소유자 관리
  8. 압축 및 아카이브
  9. 개발 환경 설정
  10. 실전 시나리오별 명령어 조합

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$"
jqJSON 파싱cat data.json | jq '.name'
batcat 개선bat file.txt
ncdu디스크 사용량 UIncdu /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

학습 팁

  1. man 페이지 활용: man ls, man grep
  2. tldr 설치: 간단한 예제 보기 (npm install -g tldr)
  3. 히스토리 검색: Ctrl+R로 이전 명령어 빠르게 찾기
  4. 별칭 설정: 자주 쓰는 명령어는 ~/.bashrc에 별칭 추가
  5. 스크립트 작성: 반복 작업은 쉘 스크립트로 자동화

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개:

  1. ls -lah — 파일 목록
  2. cd — 디렉토리 이동
  3. grep — 텍스트 검색
  4. tail -f — 로그 실시간
  5. ps aux | grep — 프로세스 찾기
  6. lsof -i — 포트 확인
  7. curl — HTTP 요청
  8. df -h — 디스크 사용량
  9. top — 리소스 모니터링
  10. systemctl status — 서비스 상태

문제 해결 흐름:

  1. 로그 확인: tail -f, journalctl
  2. 리소스 확인: top, df, free
  3. 네트워크 확인: lsof, netstat, curl
  4. 프로세스 확인: ps, pgrep
  5. 재시작: systemctl restart

학습 자료

온라인 연습:

:

  • “The Linux Command Line” by William Shotts
  • “Unix and Linux System Administration Handbook”

다음 단계

명령어에 익숙해지면:

  • Git 기본 사용법
  • Node.js 배포 가이드
  • Cloudflare Pages 배포
  • 개발 취업 실전 팁

실전 적용:

  1. 자주 쓰는 명령어 10개 선택
  2. ~/.bashrc에 별칭 추가
  3. 배포 스크립트 작성
  4. 모니터링 대시보드 구축

자주 묻는 질문 (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 배포
---
... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3