개발자를 위한 리눅스 필수 명령어 총정리
리눅스 터미널에서 반드시 알아야 할 파일 관리, 프로세스 관리, 네트워크, 권한 관리, 쉘 스크립트 기초까지 개발자 필수 명령어를 총정리합니다.
개발자를 위한 리눅스 필수 명령어 총정리
리눅스는 서버 운영체제의 사실상 표준이며, 클라우드 인프라의 대부분이 리눅스 기반으로 운영됩니다. 개발자라면 리눅스 명령어를 능숙하게 다룰 수 있어야 서버 배포, 디버깅, 시스템 관리 등의 작업을 효율적으로 수행할 수 있습니다. 이 글에서는 개발자가 반드시 알아야 할 리눅스 명령어를 카테고리별로 체계적으로 정리합니다.
파일 및 디렉토리 관리
파일과 디렉토리를 다루는 것은 리눅스에서 가장 기본적이면서도 자주 사용하는 작업입니다.
디렉토리 이동과 확인
# 현재 디렉토리 확인
pwd
# 출력: /home/user
# 디렉토리 이동
cd /var/log # 절대 경로로 이동
cd .. # 상위 디렉토리로 이동
cd ~ # 홈 디렉토리로 이동
cd - # 이전 디렉토리로 이동
# 디렉토리 내용 확인
ls # 기본 목록
ls -la # 숨김 파일 포함, 상세 정보 표시
ls -lh # 파일 크기를 읽기 쉬운 형태로 표시
ls -lt # 수정 시간순 정렬
ls -lS # 파일 크기순 정렬
ls -R # 하위 디렉토리까지 재귀적으로 표시
파일 및 디렉토리 생성, 복사, 이동, 삭제
# 디렉토리 생성
mkdir mydir # 단일 디렉토리 생성
mkdir -p parent/child/grandchild # 중간 디렉토리까지 한번에 생성
# 파일 생성
touch newfile.txt # 빈 파일 생성 (또는 수정 시간 갱신)
# 파일 복사
cp source.txt dest.txt # 파일 복사
cp -r sourcedir/ destdir/ # 디렉토리 재귀 복사
cp -p source.txt dest.txt # 권한과 타임스탬프 유지하며 복사
# 파일 이동 및 이름 변경
mv old.txt new.txt # 이름 변경
mv file.txt /tmp/ # 파일 이동
mv dir1/ dir2/ # 디렉토리 이동
# 파일 삭제
rm file.txt # 파일 삭제
rm -r directory/ # 디렉토리 및 하위 내용 삭제
rm -rf directory/ # 강제 삭제 (확인 없이)
rmdir emptydir/ # 빈 디렉토리만 삭제
파일 내용 확인
# 파일 전체 내용 보기
cat file.txt # 전체 내용 출력
cat -n file.txt # 줄 번호와 함께 출력
# 부분 내용 보기
head file.txt # 처음 10줄
head -n 20 file.txt # 처음 20줄
tail file.txt # 마지막 10줄
tail -n 50 file.txt # 마지막 50줄
tail -f /var/log/syslog # 실시간 로그 모니터링 (매우 유용!)
# 페이지 단위로 보기
less file.txt # 스크롤 가능한 뷰어
more file.txt # 기본 페이지 뷰어
# 파일 정보 확인
file document.pdf # 파일 타입 확인
wc file.txt # 줄 수, 단어 수, 바이트 수
wc -l file.txt # 줄 수만 확인
stat file.txt # 상세 파일 정보
파일 검색과 텍스트 검색
서버에서 특정 파일이나 로그 내용을 빠르게 찾는 것은 매우 중요한 기술입니다.
find 명령어
# 이름으로 파일 검색
find / -name "config.yml" # 전체 시스템에서 검색
find /home -name "*.log" # 특정 디렉토리에서 패턴 검색
find . -name "*.js" -not -path "*/node_modules/*" # 특정 경로 제외
# 타입으로 검색
find /var -type f -name "*.conf" # 파일만 검색
find /home -type d -name "backup" # 디렉토리만 검색
# 시간 기준 검색
find /tmp -mtime +7 # 7일 이상 수정되지 않은 파일
find /log -mmin -30 # 30분 이내 수정된 파일
# 크기 기준 검색
find / -size +100M # 100MB 이상 파일
find /home -size +1G -type f # 1GB 이상 파일
# 검색 후 작업 실행
find /tmp -name "*.tmp" -delete # 검색 후 삭제
find . -name "*.py" -exec grep -l "import os" {} \; # 검색 후 명령 실행
grep 명령어
# 기본 텍스트 검색
grep "error" /var/log/syslog # 파일에서 패턴 검색
grep -i "warning" logfile.txt # 대소문자 무시
grep -r "TODO" ./src/ # 디렉토리 재귀 검색
grep -n "function" script.js # 줄 번호 표시
# 정규표현식 사용
grep -E "^[0-9]+" data.txt # 숫자로 시작하는 줄
grep -E "error|warning|critical" log.txt # 여러 패턴 OR 검색
grep -v "DEBUG" app.log # 패턴 제외 (역매칭)
# 컨텍스트 표시
grep -A 3 "Exception" error.log # 매칭 후 3줄 표시
grep -B 2 "Exception" error.log # 매칭 전 2줄 표시
grep -C 5 "Exception" error.log # 매칭 전후 5줄 표시
# 파일명만 출력
grep -rl "password" /etc/ # 매칭되는 파일명만 출력
grep -c "error" *.log # 파일별 매칭 횟수
프로세스 관리
서버에서 실행 중인 프로세스를 모니터링하고 관리하는 것은 시스템 관리의 핵심입니다.
프로세스 조회
# 프로세스 목록 확인
ps aux # 모든 프로세스 상세 정보
ps aux | grep nginx # 특정 프로세스 검색
ps -ef --forest # 프로세스 트리 구조 표시
# 실시간 모니터링
top # 실시간 프로세스 모니터
htop # top의 개선 버전 (설치 필요)
# 특정 포트 사용 프로세스 확인
lsof -i :3000 # 3000번 포트 사용 프로세스
lsof -i :80 # 80번 포트 사용 프로세스
ss -tlnp # 열린 포트와 프로세스 목록
netstat -tlnp # 네트워크 연결 상태
프로세스 제어
# 프로세스 종료
kill PID # SIGTERM (정상 종료 요청)
kill -9 PID # SIGKILL (강제 종료)
kill -15 PID # SIGTERM (명시적)
killall nginx # 이름으로 모든 프로세스 종료
pkill -f "node server.js" # 패턴으로 프로세스 종료
# 백그라운드 실행
nohup node server.js & # 터미널 종료 후에도 실행 유지
nohup node server.js > output.log 2>&1 & # 출력을 파일로 리다이렉트
# 작업 관리
jobs # 현재 쉘의 백그라운드 작업 목록
bg %1 # 작업을 백그라운드로 전환
fg %1 # 작업을 포그라운드로 전환
사용자와 권한 관리
리눅스의 파일 권한 시스템을 이해하는 것은 보안과 시스템 관리의 기본입니다.
권한의 이해
리눅스의 파일 권한은 세 그룹(소유자, 그룹, 기타)에 대해 세 가지 권한(읽기, 쓰기, 실행)으로 구성됩니다.
-rwxr-xr-- 1 user group 4096 Jan 15 10:30 script.sh
│├──┤├──┤├──┤
│ │ │ └── 기타 사용자: 읽기(r)만 가능
│ │ └─────── 그룹: 읽기(r)와 실행(x)
│ └──────────── 소유자: 읽기(r), 쓰기(w), 실행(x)
└────────────── 파일 타입 (-: 일반파일, d: 디렉토리)
권한 변경
# chmod: 권한 변경
chmod 755 script.sh # rwxr-xr-x (숫자 방식)
chmod 644 config.txt # rw-r--r--
chmod +x deploy.sh # 실행 권한 추가 (기호 방식)
chmod -w file.txt # 쓰기 권한 제거
chmod u+x,g+r script.sh # 소유자에 실행, 그룹에 읽기 추가
chmod -R 755 /var/www/ # 하위 전체에 재귀 적용
# chown: 소유자 변경
chown user:group file.txt # 소유자와 그룹 변경
chown -R www-data:www-data /var/www/ # 재귀적으로 소유자 변경
# 숫자 권한 참고
# 4: 읽기 (r)
# 2: 쓰기 (w)
# 1: 실행 (x)
# 7 = 4+2+1 (rwx), 6 = 4+2 (rw-), 5 = 4+1 (r-x), 4 = 4 (r--)
사용자 관리
# 사용자 생성 및 관리
sudo useradd -m -s /bin/bash newuser # 새 사용자 생성
sudo passwd newuser # 비밀번호 설정
sudo usermod -aG sudo newuser # sudo 그룹에 추가
sudo userdel -r olduser # 사용자 삭제 (홈 디렉토리 포함)
# 사용자 전환
su - username # 다른 사용자로 전환
sudo command # 관리자 권한으로 명령 실행
sudo -u www-data command # 특정 사용자 권한으로 실행
# 현재 사용자 정보
whoami # 현재 사용자 이름
id # UID, GID, 그룹 정보
groups # 소속 그룹 확인
네트워크 관리
서버의 네트워크 상태를 확인하고 외부와의 통신을 점검하는 명령어들입니다.
네트워크 정보 확인
# IP 주소 확인
ip addr show # 네트워크 인터페이스 정보
hostname -I # IP 주소만 표시
# DNS 확인
nslookup example.com # DNS 조회
dig example.com # 상세 DNS 조회
host example.com # 간단한 DNS 조회
# 라우팅 테이블
ip route show # 라우팅 정보 확인
traceroute example.com # 경로 추적
연결 테스트
# 핑 테스트
ping google.com # 연결 테스트
ping -c 4 8.8.8.8 # 4회만 핑
# HTTP 요청
curl https://api.example.com/status # GET 요청
curl -X POST -H "Content-Type: application/json" \
-d '{"key":"value"}' \
https://api.example.com/data # POST 요청
curl -o file.zip https://example.com/file.zip # 파일 다운로드
curl -I https://example.com # 헤더만 확인
wget https://example.com/file.tar.gz # 파일 다운로드
wget -r -np https://example.com/docs/ # 재귀적 다운로드
# 포트 연결 테스트
nc -zv example.com 443 # 포트 열림 여부 확인
telnet example.com 80 # 포트 연결 테스트
방화벽 관리
# UFW (Ubuntu)
sudo ufw status # 방화벽 상태 확인
sudo ufw allow 80 # 80번 포트 허용
sudo ufw allow 443/tcp # HTTPS 허용
sudo ufw deny 3306 # MySQL 포트 차단
sudo ufw enable # 방화벽 활성화
# iptables (범용)
sudo iptables -L # 현재 규칙 확인
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 80번 포트 허용
디스크 및 시스템 관리
서버의 디스크 사용량과 시스템 상태를 모니터링하는 것은 안정적인 운영의 기본입니다.
디스크 관리
# 디스크 사용량 확인
df -h # 파일시스템별 사용량
df -h / # 루트 파티션 사용량
# 디렉토리 용량 확인
du -sh /var/log/ # 특정 디렉토리 총 용량
du -sh * # 현재 디렉토리의 각 항목 크기
du -sh * | sort -rh | head -10 # 큰 항목 상위 10개
# 디스크 정보
lsblk # 블록 디바이스 목록
fdisk -l # 파티션 정보
시스템 정보
# 시스템 기본 정보
uname -a # 커널 정보
cat /etc/os-release # OS 버전 정보
uptime # 가동 시간과 부하
# 메모리 정보
free -h # 메모리 사용량
vmstat 1 5 # 1초 간격 5회 메모리/CPU 통계
# CPU 정보
nproc # CPU 코어 수
lscpu # CPU 상세 정보
# 시스템 로그
journalctl -f # 실시간 시스템 로그
journalctl -u nginx # 특정 서비스 로그
dmesg | tail # 커널 메시지
압축과 아카이브
# tar: 아카이브 생성과 추출
tar -czf archive.tar.gz directory/ # gzip 압축 아카이브 생성
tar -cjf archive.tar.bz2 directory/ # bzip2 압축 아카이브 생성
tar -xzf archive.tar.gz # gzip 아카이브 추출
tar -xzf archive.tar.gz -C /target/ # 특정 디렉토리에 추출
tar -tzf archive.tar.gz # 아카이브 내용 확인 (추출 없이)
# zip
zip -r archive.zip directory/ # zip 압축
unzip archive.zip # zip 해제
unzip -l archive.zip # zip 내용 확인
# gzip
gzip file.txt # 파일 압축 (원본 대체)
gunzip file.txt.gz # 압축 해제
gzip -k file.txt # 원본 유지하며 압축
리다이렉션과 파이프
리눅스 명령어의 진정한 힘은 명령어를 조합하는 데 있습니다. 리다이렉션과 파이프를 통해 강력한 데이터 처리 파이프라인을 구성할 수 있습니다.
# 출력 리다이렉션
echo "Hello" > file.txt # 파일에 쓰기 (덮어쓰기)
echo "World" >> file.txt # 파일에 추가
command 2> error.log # 에러 출력만 파일로
command > output.log 2>&1 # 표준 출력과 에러 모두 파일로
command > /dev/null 2>&1 # 모든 출력 무시
# 파이프 활용 예시
cat access.log | grep "404" | wc -l # 404 에러 횟수 세기
ps aux | sort -rk 3 | head -10 # CPU 사용 상위 10 프로세스
cat /etc/passwd | cut -d: -f1 | sort # 사용자 목록 정렬
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 # 가장 많이 사용한 명령어
# 유용한 조합
# 로그에서 IP별 접속 횟수 상위 10개
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# 실시간 로그에서 에러만 필터링
tail -f /var/log/app.log | grep --line-buffered "ERROR"
쉘 스크립트 기초
반복적인 작업을 자동화하기 위해 쉘 스크립트를 작성하는 것은 매우 유용합니다.
기본 스크립트 구조
#!/bin/bash
# 스크립트 설명: 서버 상태 점검 스크립트
# 변수 사용
SERVER_NAME="Production Server"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== ${SERVER_NAME} 상태 점검 ==="
echo "점검 시간: ${DATE}"
echo ""
# 시스템 정보 출력
echo "--- CPU 부하 ---"
uptime
echo ""
echo "--- 메모리 사용량 ---"
free -h
echo ""
echo "--- 디스크 사용량 ---"
df -h /
echo ""
echo "--- 실행 중인 서비스 ---"
systemctl is-active nginx && echo "Nginx: 실행 중" || echo "Nginx: 중지됨"
systemctl is-active mysql && echo "MySQL: 실행 중" || echo "MySQL: 중지됨"
조건문과 반복문
#!/bin/bash
# 조건문
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 90 ]; then
echo "경고: 디스크 사용량이 ${DISK_USAGE}%입니다!"
elif [ "$DISK_USAGE" -gt 70 ]; then
echo "주의: 디스크 사용량이 ${DISK_USAGE}%입니다."
else
echo "정상: 디스크 사용량 ${DISK_USAGE}%"
fi
# for 반복문
echo "로그 파일 백업 시작..."
for logfile in /var/log/*.log; do
if [ -f "$logfile" ]; then
cp "$logfile" "/backup/$(basename $logfile).$(date +%Y%m%d)"
echo "백업 완료: $logfile"
fi
done
# while 반복문 - 서버 헬스체크
while true; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/health)
if [ "$STATUS" != "200" ]; then
echo "$(date): 서버 응답 이상 - HTTP ${STATUS}"
fi
sleep 60
done
함수 사용
#!/bin/bash
# 함수 정의
log_message() {
local level=$1
local message=$2
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${level}] ${message}"
}
check_service() {
local service=$1
if systemctl is-active --quiet "$service"; then
log_message "INFO" "${service} 서비스 정상 실행 중"
return 0
else
log_message "ERROR" "${service} 서비스 중지됨!"
return 1
fi
}
# 함수 호출
log_message "INFO" "시스템 점검 시작"
check_service "nginx"
check_service "mysql"
log_message "INFO" "시스템 점검 완료"
자주 사용하는 유용한 명령어 모음
마지막으로, 일상적인 개발 작업에서 자주 활용되는 명령어들을 정리합니다.
# 명령어 히스토리
history # 명령어 이력 확인
history | grep "docker" # 특정 명령어 검색
!! # 마지막 명령어 재실행
!$ # 마지막 명령어의 마지막 인수
# 환경 변수
export NODE_ENV=production # 환경 변수 설정
echo $PATH # PATH 확인
env # 모든 환경 변수 출력
source ~/.bashrc # 설정 파일 재로드
# 시간 관련
date # 현재 날짜/시간
date '+%Y-%m-%d %H:%M:%S' # 포맷 지정
cal # 달력 표시
# 기타 유용한 명령어
alias ll='ls -la' # 별칭 설정
which python3 # 명령어 경로 확인
type ls # 명령어 타입 확인
man grep # 매뉴얼 페이지
xargs # 표준 입력을 명령어 인수로 변환
watch -n 2 "df -h" # 2초마다 명령어 반복 실행
마무리
이 글에서 다룬 명령어들은 리눅스 시스템 관리의 기초를 이루는 핵심 명령어들입니다. 처음에는 외우기 어려울 수 있지만, 실제 서버를 다루면서 반복적으로 사용하다 보면 자연스럽게 익숙해집니다.
특히 파이프(|)와 리다이렉션을 활용한 명령어 조합은 리눅스의 가장 강력한 기능 중 하나입니다. 여러 명령어를 연결하여 복잡한 데이터 처리를 한 줄로 수행할 수 있다는 것은 리눅스 터미널만의 큰 장점입니다.
추가로 Docker, Kubernetes 같은 컨테이너 기술과 Ansible, Terraform 같은 인프라 자동화 도구도 모두 리눅스 명령어 기반으로 동작하므로, 여기서 다룬 기초를 탄탄히 다져놓으면 DevOps 영역으로의 확장도 수월해질 것입니다. 꾸준히 터미널 환경에서 작업하면서 자신만의 생산성 도구와 스크립트를 만들어 나가시기 바랍니다.
관련 게시글
GitOps Workflow 설계 가이드: Kubernetes와 CI/CD를 활용한 자동화
GitOps는 선언적 인프라 및 애플리케이션 관리를 위한 강력한 패러다임입니다. 이 가이드에서는 Git을 Single Source of Truth로 활용하여 Kubernetes 환경에서 안정적이고 효율적인 GitOps 워크플로우를 설계하는 방법을 Docker, CI/CD 자동화 예시와 함께 상세히 설명합니다.
GitHub Actions Advanced Workflows: Docker, Kubernetes CI/CD
GitHub Actions를 활용한 Docker, Kubernetes 기반 CI/CD 파이프라인 구축 심화 가이드. DevOps 엔지니어링 관점에서 자동화 전략을 탐구합니다.
Terraform Infrastructure Automation: DevOps 엔지니어링 가이드
Terraform을 활용한 인프라 자동화의 핵심 개념부터 실제 AWS 환경에서의 배포 예시까지, DevOps 엔지니어링 관점에서 자세히 알아봅니다. IaC, Docker, Kubernetes, CI/CD 파이프라인 통합 전략을 다룹니다.