오늘은 오전에는 리눅스 특강
오후에는 서비스 기획에 대한 특강이 있었다.
오전
목차
1. 리눅스란 무엇인가?
2. 리눅스 기본 명령어 실습
3. 파일, 디렉토리 다루기 실습
4. 네트워크 & 쉘 스크립트 실습
5. 권한, 프로세스, screen 실습
6. 실무에서 자주 쓰이는 명령어 실습
1. 리눅스란 무엇인가?
목표: 리눅스의 기본 철학과 역사, 구조 이해하기
개요
- 리눅스(Linux) 는 Unix 계열 운영체제(OS)의 한 종류입니다.→ “오픈소스”, “무료”, “서버 환경의 표준”이 핵심 키워드입니다.
- 커널(Kernel) : 운영체제의 핵심. 하드웨어와 소프트웨어를 연결
- 배포판(Distro) : Ubuntu, CentOS, Debian, Fedora 등
- CLI vs GUI : 리눅스는 기본적으로 명령어 중심 (Command Line Interface)
리눅스가 많이 쓰이는 이유
분야사용 예시
| 서버 | AWS EC2, GCP VM, Naver Cloud VM |
| 데이터 엔지니어링 | Airflow, Spark, Hadoop |
| 머신러닝/AI | 모델 학습 서버, Docker 컨테이너 |
| 임베디드 | Android, Raspberry Pi 등 |
Docker Desktop 설치
macOS (Intel / M1 / M2)
- Docker Desktop 다운로드 https://www.docker.com/products/docker-desktop/
- Apple Silicon(M1/M2) 사용자는 ARM 버전 자동 인식됨
- 설치 후 실행 → Docker 아이콘이 메뉴바에 표시되면 정상 구동
Windows 10 / 11
- WSL2 활성화 및 Docker Desktop 설치
wsl --install
- Docker Desktop for Windows 다운로드 https://www.docker.com/products/docker-desktop/
- 실행 후 “Use the WSL 2 based engine” 옵션 체크
설치 후 재부팅 필수입니다.
Docker가 실행 중일 때만 컨테이너 명령어가 동작합니다.
Ubuntu 컨테이너 실행하기
Docker가 실행 중인 상태에서 터미널(또는 PowerShell)을 열고 아래 명령어를 입력합니다:
docker run -it --name my-ubuntu ubuntu:24.04
- -it: 인터랙티브 모드로 터미널 연결
- --name my-ubuntu: 컨테이너 이름 지정
- ubuntu:24.04: Ubuntu 24.04 LTS 이미지 사용
실행 후 프롬프트가 root@xxxx:/# 형태로 바뀌면 성공입니다.
이 환경이 바로 리눅스 실습용 Ubuntu입니다.
기본 패키지 설치 (한 번만 실행)
컨테이너 안에서 아래 명령어 입력:
apt update && apt install -y vim curl wget net-tools tree htop sudo
이러면 실습용 필수 명령어들이 설치됩니다.
timezone 설정이 필요하면 5, 68 입력
Configuring tzdata
------------------
Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by
presenting a list of cities, representing the time zones in which they are located.
1. Africa 3. Antarctica 5. Asia 7. Australia 9. Indian 11. Etc
2. America 4. Arctic 6. Atlantic 8. Europe 10. Pacific 12. Legacy
Geographic area: 5
Please select the city or region corresponding to your time zone.
1. Aden 16. Brunei 31. Hong_Kong 46. Kuala_Lumpur 61. Pyongyang 76. Tel_Aviv
2. Almaty 17. Chita 32. Hovd 47. Kuching 62. Qatar 77. Thimphu
3. Amman 18. Choibalsan 33. Irkutsk 48. Kuwait 63. Qostanay 78. Tokyo
4. Anadyr 19. Chongqing 34. Istanbul 49. Macau 64. Qyzylorda 79. Tomsk
5. Aqtau 20. Colombo 35. Jakarta 50. Magadan 65. Riyadh 80. Ulaanbaatar
6. Aqtobe 21. Damascus 36. Jayapura 51. Makassar 66. Sakhalin 81. Urumqi
7. Ashgabat 22. Dhaka 37. Jerusalem 52. Manila 67. Samarkand 82. Ust-Nera
8. Atyrau 23. Dili 38. Kabul 53. Muscat 68. Seoul 83. Vientiane
9. Baghdad 24. Dubai 39. Kamchatka 54. Nicosia 69. Shanghai 84. Vladivostok
10. Bahrain 25. Dushanbe 40. Karachi 55. Novokuznetsk 70. Singapore 85. Yakutsk
11. Baku 26. Famagusta 41. Kashgar 56. Novosibirsk 71. Srednekolymsk 86. Yangon
12. Bangkok 27. Gaza 42. Kathmandu 57. Omsk 72. Taipei 87. Yekaterinburg
13. Barnaul 28. Harbin 43. Khandyga 58. Oral 73. Tashkent 88. Yerevan
14. Beirut 29. Hebron 44. Kolkata 59. Phnom_Penh 74. Tbilisi
15. Bishkek 30. Ho_Chi_Minh 45. Krasnoyarsk 60. Pontianak 75. Tehran
Time zone: 68
컨테이너 재접속 / 관리 명령어
동작명령어
| 실행 중 컨테이너 목록 보기 | docker ps |
| 중지된 컨테이너 포함 보기 | docker ps -a |
| 중지하기 | docker stop my-ubuntu |
| 다시 실행하기 | docker start -ai my-ubuntu |
| 삭제하기 | docker rm my-ubuntu |
Mac/Windows 폴더 공유 (선택)
Mac 혹은 Windows의 특정 폴더를 컨테이너 안에서 사용하려면:
docker run -it -v ~/Documents/linux-lab:/root/workspace --name my-ubuntu ubuntu:24.04
- ~/Documents/linux-lab → 로컬 경로
- /root/workspace → 컨테이너 내부 경로
이제 로컬 파일을 바로 리눅스 환경에서 접근할 수 있습니다.
실행 단축 명령어 등록 (선택)
매번 명령어를 길게 입력하지 않기 위해 alias를 등록합니다.
echo "alias ubuntu='docker start -ai my-ubuntu'" >> ~/.zshrc
source ~/.zshrc
이제 터미널에서 단순히 ubuntu 입력 시 바로 리눅스 컨테이너로 접속됩니다
실습 환경 요약
항목내용
| 실행 OS | Ubuntu 24.04 LTS (Docker 기반) |
| 설치 도구 | Docker Desktop (Windows/macOS 공통) |
| 접속 방법 | docker run -it ubuntu:24.04 |
| 장점 | 빠름 , 가볍고 복원 쉬움, OS 상관없이 동일 환경 |
| 단점 | CLI 환경만 제공 (그래픽 데스크탑 없음) |
2. 리눅스 기본 명령어 실습
목표
Docker로 실행된 Ubuntu 컨테이너에서
로컬과 공유된 디렉토리를 활용해 리눅스 기본 명령어를 익힌다.
공유 폴더 예시:
- 로컬 경로: ~/linux-lab
- 컨테이너 내부 경로: cd /root/workspace cd ~/workspace
- pwd
사전 준비 (이미 완료했다고 가정)
Docker로 Ubuntu 컨테이너 실행:
docker run -it -v ~/linux-lab:/root/workspace --name my-ubuntu ubuntu:24.04
컨테이너 내부 공유 디렉토리 위치:
/root/workspace
실습 1 — 디렉토리 이동 (cd)
cd /root/workspace
실습 2 — 현재 경로 확인 (pwd)
pwd
예상 결과:
/root/workspace
실습 3 — 파일 목록 확인 (ls)
ls
옵션 포함:
ls -lh
실습 4 — 디렉토리 구조 보기 (tree)
설치 필요:
apt update && apt install -y tree
사용:
tree
# tree 결과
root@64877496840f:~# tree
.
|-- big.log
|-- example.html
|-- index.html
|-- index.html.1
|-- log_writer.sh
|-- logs2
| |-- app.log
| `-- app2.log
|-- myapp
| |-- app.py
| |-- config.yaml
| |-- readme.txt
| `-- static
| `-- style.css
|-- myapp.tar.gz
|-- png
|-- users.csv
`-- workspace
5 directories, 14 files
실습 5 — 파일 생성 (touch)
touch test.txt
ls
tree
로컬 ~/linux-lab에도 동일한 파일이 생성됨을 확인.
실습 6 — 파일 내용 출력 (cat)
echo "Hello Linux" > test.txt
cat test.txt
실습 7 — 상대경로/절대경로 이동
상위로 이동:
cd ..
pwd
다시 돌아오기:
cd workspace
pwd
바로 이전 디렉토리로 이동:
cd /root
pwd
cd -
pwd
실습 8
man 사용:
sudo unminimize
sudo apt install -y man-db manpages
man ls
--help 사용
ls --help
둘의 차이?
- man: 공식 매뉴얼, 매우 상세
- --help: 명령어 자체가 제공하는 요약 도움말
실습 9 — 컨테이너 종료
exit
컨테이너 재접속:
docker start -ai my-ubuntu
실습 요약
- cd /root/workspace
- pwd
- ls, ls -lh
- tree
- touch test.txt
- cat test.txt
- cd .., cd workspace, cd -
- man , --help
- 종료는 exit, 재접속은 docker start -ai my-ubuntu
추가 실습 — Hello World 파일 만들기
공유된 디렉토리 /root/workspace 안에서
"Hello World"라는 문장을 가진 hello.txt 파일을 만들어보세요.
목표
- 파일 생성
- 내용 입력
- 파일 내용 확인
힌트 (사용할 명령어)
- touch
- echo
- cat
- 리다이렉션: >
3. 파일·디렉토리 다루기 실습
목표
리눅스에서 파일 생성, 이동, 삭제, 복사, 검색, 출력, 텍스트 처리, 파이프 사용을 익히고
head/tail 실습을 위해 실제 로그 파일을 직접 생성해본다.
실습
사전 실습 — 로그 파일 생성하기 (head/tail 준비)
100줄짜리 로그 파일 생성:
for i in {1..100}; do
echo "INFO Line $i - Sample log message";
done > sample.log
실제 같은 로그 파일:
for i in {1..150}; do
if (( i % 15 == 0 )); then
echo "ERROR Something failed at step $i"
elif (( i % 10 == 0 )); then
echo "WARN Potential issue detected at $i"
else
echo "INFO Normal operation line $i"
fi
done > system.log
실습 1 — 파일 복사 (cp)
cp system.log backup.txt
mkdir src_folder
cp ./backup.txt src_folder/
ls src_folder
mkdir src_folder/test
ls src_folder
cp src_folder test_foler # -r 옵션 차이 확인: test 폴더를 복사를 못해서 ..
cp -r src_folder dst_folder
ls dst_folder
tree
실습 2 — 파일 이동 또는 이름 변경 (mv)
mv backup.txt newname.txt
ls
mv newname.txt /root/workspace/logs/ #error 확인
mkdir /root/workspace/logs/
ls
ls /root/workspace/logs/
mv newname.txt /root/workspace/logs/
ls /root/workspace/logs/
실습 3 — 파일 삭제 (rm)
cp system.log file.txt
rm file.txt
rm dst_folder # -r 차이점 확인
rm -r dst_folder
rm -rf src_folder
삭제 명령의 원리 설명
- rm은 휴지통이 없음
- 삭제 즉시 파일이 사라짐
- rm -r은 폴더까지 재귀적으로 삭제
절대 입력하면 안 되는 명령어
rm -rf /
이 명령은 리눅스 시스템 전체를 삭제하는 최악의 명령어로,
Docker 컨테이너든 실제 서버든 시스템이 완전히 파괴됩니다.
- / = 시스템 전체 루트 디렉토리
- rm -rf = 묻지도 따지지도 않고 강제 삭제
실습 4 — 파일 검색 (find)
cp system.log file.txt
find . -name "*.txt"
find / -name "*.txt"
find /root/workspace -type f -name "error*"
실습 5 — 파일 내용 출력 (cat)
cat system.log
실습 6 — 파일 일부 보기 (head / tail)
head system.log
tail system.log
대용량 파일(옵션):
for i in {1..1000}; do echo "DEBUG $i"; done > big.log
head big.log
tail big.log
실습 7 — 파일을 페이지 단위로 보기 (less)
apt update && apt install -y less
less system.log
(종료: q)
실습 8 — 여러 파일 합치기
cat a.txt b.txt > all.txt
실습 9 — 특정 단어 포함된 줄 찾기 (grep)
grep "error" system.log # 안나옴
grep "ERROR" system.log
grep -i "error" system.log # 절댓값으로 값을 출력함, 대소문자 구분 x
실습 10 — 파이프 사용
cat system.txt | grep -i "error"
grep "WARN" system.log | head
grep "WARN" system.log
실습 요약
기능명령어
| 복사 | cp, cp -r |
| 이동/이름 변경 | mv |
| 삭제 | rm, rm -r |
| 검색 | find |
| 출력 | cat, head, tail, less |
| 텍스트 필터링 | grep |
| 파일 병합 | cat a b > c |
| 파이프 | ` |
| 로그 생성 | echo, for, 리다이렉션 |
추가 실습
1)log 폴더를 만들고
system.txt 파일에서
ERROR로 시작하는 줄만 모아
log/error_summary.txt 파일로 저장하세요.
2) a.txt 는 hello 문장을,
b.txt 는 world 문장을 가진 파일을 만들고 병합해보세요.
힌트
- mkdir log
- grep "^ERROR"
- cat
- > 리다이렉션
4. 네트워크 & 쉘 스크립트 실습
목표
리눅스에서 네트워크 명령어, curl 활용, wget 다운로드, 환경 변수, 쉘 스크립트, 반복문, 시스템 정보 조회, vim을 익힌다.
실습
실습 1 — ping 설치 + 네트워크 연결 확인
Ubuntu 최소 이미지에서는 ping 패키지가 없을 수 있으므로 설치가 필요합니다.
apt update && apt install -y iputils-ping curl
테스트:
ping -c 4 google.com
실습 2 — curl 기본 사용
curl https://example.com
curl ifconfig.me # 공인 IP 확인
curl 테스트용 사이트 모음
사이트용도예시
| https://httpbin.org | GET/POST/헤더/리다이렉트 테스트 | curl https://httpbin.org/get |
| https://postman-echo.com | GET/POST 테스트 | curl https://postman-echo.com/get?foo=bar |
| https://ifconfig.me | 공인 IP 확인 | curl ifconfig.me |
| https://example.com | 단순 HTML 다운로드 | curl https://example.com |
curl 유용한 옵션 실습
-v : 상세 로그 출력
curl -v https://httpbin.org/get
-I : 응답 헤더만 가져오기
curl -I https://example.com
-L : 리다이렉트 따라가기
curl -L https://httpbin.org/redirect/2
-H + -d : 헤더 추가 + POST JSON
curl -v -X POST https://httpbin.org/post -H "Content-Type: application/json" -d '{"name":"linux-user"}'
curl 다운로드
example.com 의 index.html 다운로드:
curl -o index.html https://www.example.com/
혹은 URL 그대로 파일명으로 저장하고 싶다면:
curl -O https://www.example.com/index.html
다운로드 확인:
ls -l
cat index.html
실습 3 — wget 다운로드
wget https://www.example.com/
index.html 확인:
ls -l
cat index.html
실습 4 — 환경 변수 확인 & 설정
cd ~
pwd
/root #확인
echo $PATH
export MYNAME="linux-user"
echo $MYNAME
echo 'export MYNAME="linux-user"' >> ~/.bashrc
vim .bashrc
실습 5 — vim 기본 사용법
vim 기본 조작
명령설명
| i | INSERT 모드 |
| Esc | NORMAL 모드 |
| :w | 저장 |
| :q or :q! | 종료 |
| :wq | 저장 후 종료 |
| dd | 줄 삭제 |
| yy | 줄 복사 |
| p | 붙여넣기 |
단어 이동 단축키
명령기능
| w | 다음 단어 시작 |
| b | 이전 단어 시작 |
| e | 단어 끝 |
| 0 | 줄 맨 앞 |
| $ | 줄 맨 뒤 |
실습 6 — Hello World 스크립트
cat << 'EOF' > hello.sh
#!/bin/bash
echo "Hello World from Shell Script"
EOF
chmod +x hello.sh
./hello.sh
실습 7 — 날짜 기반 로그 자동 생성 스크립트
cat << 'EOF' > create_daily_log.sh
#!/bin/bash
TODAY=$(date +"%Y%m%d")
echo "Log created at $(date)" > log_$TODAY.txt
EOF
chmod +x create_daily_log.sh
./create_daily_log.sh
ls
실습 8 — 반복문 for
for i in {1..3}; do
echo "File $i" > file$i.txt
done
ls #files 확인
실습 9 — 조건문 if
cat << 'EOF' > check_disk.sh
#!/bin/bash
USE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')
if [ $USE -gt 70 ]; then
echo "Warning: Disk usage high! ($USE%)"
else
echo "Disk usage normal ($USE%)"
fi
EOF
chmod +x check_disk.sh
./check_disk.sh
실습 10 — 시스템 정보 조회
top
free -h
df -h
ps aux
주의 사항
- 스크립트 실행 시 ./script.sh 사용
- 환경 변수는 export만 하면 세션 종료 시 사라짐 → .bashrc에 추가
- vim 사용 후 반드시 :wq로 저장
5. 권한, 프로세스, screen 실습
목표
리눅스에서 파일 권한, 프로세스 확인/관리, 백그라운드 실행, nohup, screen 등을 익히고
실제 서버 환경에서 사용하는 프로세스 관리 능력을 기른다.
실습
실습 1 — 파일 권한 확인 (ls -l)
ls -l
실습 2 — 권한 변경 (chmod)
# TODO: script.sh 생성
chmod +x script.sh
chmod 755 script.sh
실습 3 — 파일/폴더 소유자 변경 (chown)
chown root:root test.txt
실습 4 — 현재 실행 중인 프로세스 확인 (ps / top)
전체 프로세스 보기
ps aux
ps aux 샘플 출력
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 101 0.3 1.2 56780 5120 pts/0 Ss 10:22 0:00 -bash
root 214 0.0 0.8 45000 3200 pts/0 S 10:25 0:00 bash script.sh
root 380 0.1 0.7 41200 2900 pts/1 Ss 10:26 0:00 bash
root 455 0.0 0.4 35000 1800 pts/2 S 10:26 0:00 grep bash
ps aux 컬럼 설명
컬럼의미
| USER | 실행 사용자 |
| PID | 프로세스 ID |
| %CPU | CPU 사용률 |
| %MEM | 메모리 사용률 |
| VSZ | 가상 메모리 크기 |
| RSS | 실제 메모리 사용량 |
| TTY | 실행 중인 터미널 |
| STAT | 프로세스 상태 |
| START | 시작 시간 |
| TIME | 누적 CPU 시간 |
| COMMAND | 실행 명령어 |
실습 5 — ps -ef + grep 실습
명령어
ps -ef | grep bash
ps -ef 샘플 출력
root 1123 1087 0 10:22 pts/0 00:00:00 -bash
root 2144 1123 0 10:25 pts/0 00:00:00 bash script.sh
root 2890 1888 0 10:26 pts/1 00:00:00 bash
root 3012 2451 0 10:26 pts/2 00:00:00 grep bash
ps -ef 컬럼 설명
컬럼의미
| UID | 실행 사용자 |
| PID | 프로세스 ID |
| PPID | 부모 프로세스 ID |
| C | CPU 사용량 (%) |
| STIME | 시작 시간 |
| TTY | 실행 중인 터미널 |
| TIME | 누적 CPU 시간 |
| CMD | 실행된 전체 명령어 |
실습 6 — 백그라운드 실행 (&)
먼저 백그라운드 실행을 경험해 봅니다.
sleep 30 &
백그라운드 작업 목록 확인:
jobs
ps로도 확인:
ps -ef | grep sleep
🧩 실습 7 — 프로세스 종료 (kill)
앞에서 백그라운드로 실행한 프로세스를 종료해 봅니다.
PID 찾기:
ps -ef | grep sleep
종료:
kill <PID>
강제 종료(필요할 때만):
kill -9 <PID>
중요한 주의 사항
kill -9 남용 금지
- kill -9는 강제 종료로, 데이터 손실 가능
- 항상 kill <PID>부터 시도하세요.
실습 8 — 5초마다 로그를 쓰는 스크립트 + tail 모니터링
스크립트 생성
cat << 'EOF' > log_writer.sh
#!/bin/bash
while true
do
echo "$(date) - system running..." >> system_loop.log
sleep 5
done
EOF
실행 권한:
chmod +x log_writer.sh
백그라운드 실행:
./log_writer.sh &
로그 실시간 확인:
tail -f system_loop.log
종료:
# tail 종료
Ctrl + C
# TODO: log_writer.sh 종료
실습 9 — nohup + 백그라운드 실행
nohup 이란?
- 터미널을 닫거나 로그아웃해도 프로세스가 종료되지 않도록 해주는 명령입니다.
- 기본적으로 SIGHUP(세션 종료 시그널)을 무시하도록 만들어 줍니다.
- 표준 출력은 보통 nohup.out 파일로 저장됩니다.
예제
nohup ./log_writer.sh &
tail -f nohup.out
참고 — nohup 메시지가 왜 뜨는가?
nohup: ignoring input and appending output to 'nohup.out'
이 메시지는 정상적인 동작이다.
- ignoring input : nohup은 세션 종료 시 영향을 받지 않도록 STDIN을 무시함
- appending output to nohup.out : stdout/stderr을 nohup.out로 저장함
- nohup 이 입력을 무시하고(STDIN) 출력(stdout, stderr)을 nohup.out에 저장하고 있다는 뜻.
참고 — 리다이렉션 설명
nohup ./log_writer.sh > mylog.log 2>&1 &
구문설명
| > | stdout 덮어쓰기 |
| >> | stdout 이어쓰기 |
| 2> | stderr 리다이렉트 |
| 2>&1 | stderr → stdout 방향 합치기 |
| & | 백그라운드 실행 |
- > mylog.log: stdout은 mylog.log로 저장
- 2>&1 : stderr도 stdout의 목적지(mylog.log)에 합류
- & : 백그라운드 실행
- stdout + stderr 모두 mylog.log에 저장됨.
실습 10 — screen 사용법
screen 설치
apt update && apt install -y screen
세션 생성
screen -S mysession
세션 분리(detach)
Ctrl + A, D
세션 목록
screen -ls
세션 재접속
screen -r mysession
세션 종료
screen 내부에서:
exit
실습 11 — screen × ps × tail 연계 실습
screen -S logsession
./log_writer.sh
# 여기서 detach
Ctrl + A, D
tail -f system_loop.log
screen -r logsession
ps -ef | grep log_writer
kill <PID>
screen vs nohup 비교
기능/특징screennohup
| 목적 | 터미널 세션 전체 유지 | 개별 명령어를 세션 종료 후에도 유지 |
| 실행 형태 | 독립된 가상 터미널 제공 | 기존 셸에서 명령어만 보호 |
| 재접속 | ✔ screen -r 로 가능 | ✖ 직접 재접속 불가 (로그만 확인) |
| 상호작용 | 상호작용 가능(vi, REPL 등) | 보통 비상호작용(배치 작업) |
| 화면 확인 | 직접 접속하여 화면 확인 | nohup.out 등 로그 파일로 확인 |
| 여러 작업 관리 | 여러 세션 관리 가능 | 각 명령어별로 nohup 실행 필요 |
| 대표 사용 예 | 장시간 편집, 디버깅, REPL, 실시간 모니터링 | 배치 작업, 스크립트 실행, 단발성 작업 |
백그라운드 실행(&) vs nohup 비교
항목command & (백그라운드)nohup command &
| 터미널 종료 시 | 프로세스가 종료될 수 있음 (SIGHUP 전송) | 프로세스가 계속 실행됨 (SIGHUP 무시) |
| 실행 위치 | 현재 셸 세션에 종속 | 세션 종료에도 비교적 독립적 |
| 표준 출력 | 터미널로 출력(또는 리다이렉션 필요) | 기본적으로 nohup.out에 저장 |
| 용도 | 잠깐 백그라운드에 돌리고 같은 세션에서 관리 | 서버에서 장시간 돌릴 작업, 세션 끊겨도 유지해야 할 작업 |
| 사용 난이도 | 매우 쉬움 | 약간 더 개념적이지만 명령은 간단 |
추가 실습
1) sleep 100 을 & 로 실행하고, ps -ef | grep 으로 PID를 찾아 kill 해보세요.
2) log_writer.sh를 nohup 으로 실행해보고, 터미널을 종료/재접속한 뒤에도 살아있는지 확인해보세요.
3) 같은 작업을 screen 세션 안에서 실행한 뒤, detach/reattach 를 반복해보세요.
6. 실무에서 자주 쓰는 명령어 실습
(du, df, tar, zip, python, which/whereis, less, grep 심화, cut, awk, view, uptime, service/nginx)
목표
서버 운영·배포·장애 대응에서 실제로 자주 사용하는 리눅스 명령어들을 실습 위주로 익힌다.
실습 1 — 디렉토리 용량 확인 (du)
du -sh .
du -sh *
du -sh logs/*
디스크 Full 이슈가 생겼을 때, “어느 폴더가 많이 먹는지” 확인하는 데 활용.
실습 2 — 전체 디스크 용량 확인 (df)
df -h
df -h /
- 전체 디스크 파티션 사용량 확인
- -h: GB/MB 단위로 보기
실습 3 — tar / zip 실습용 테스트 디렉토리 생성
mkdir myapp
touch myapp/app.py
touch myapp/config.yaml
mkdir myapp/static
touch myapp/static/style.css
echo "hello linux" > myapp/readme.txt
ls -R myapp
실습 4 — tar 압축 / 해제
tar -czvf myapp.tar.gz myapp/
tar -xzvf myapp.tar.gz
- c : 생성(create)
- z : gzip 압축
- v : 진행 상황 출력
- f : 파일 이름 지정
실습 5 — zip / unzip
apt update && apt install -y zip unzip
zip -r myapp.zip myapp/
unzip myapp.zip
실습 6 — python 설치 (which 실습 준비)
apt update && apt install -y python3
python3 --version
실습 7 — which (명령어 위치 확인)
which python3
which curl
which tar
which nginx
출력 예시:
/usr/bin/python3
/usr/bin/curl
PATH 상에서 실제로 어떤 실행 파일이 쓰이는지 확인할 때 사용.
실습 8 — whereis (명령/문서/라이브러리 위치 검색)
whereis python3
whereis nginx
whereis bash
예시:
python3: /usr/bin/python3 /usr/lib/python3.10 /usr/share/man/man1/python3.1.gz
which 는 실행 파일 한 개 경로 중심,
whereis 는 실행 파일 + man 페이지 + 관련 파일까지 같이 보여줌.
실습 9 — less vs tail (로그 보기 방식 비교)
테스트 로그 만들기:
for i in {1..50}; do echo "LINE $i - sample log" >> big.log; done
tail
tail big.log
tail -n 20 big.log
- 파일의 끝부분 위주로 짧게 확인할 때 사용
less
apt update && apt install -y less
less big.log
- ↑ / ↓ : 한 줄씩 이동
- Space : 다음 페이지
- g : 맨 위로
- G : 맨 아래로
- /문자열 : 검색
- q : 종료
tail 은 “마지막 몇 줄만 잠깐 보는 용도”,
less 는 “긴 로그를 위아래로 오가며 보는 용도”.
실습 10 — grep 심화 옵션 (-r, -n, -i)
테스트용 디렉토리/파일 생성:
mkdir logs2
echo -e "Error: something failed
INFO: all good
error: lower case" > logs2/app.log
echo -e "WARN: be careful
INFO: done" > logs2/app2.log
1) -n : 줄 번호 함께 출력
grep -n "Error" logs2/app.log
2) -i : 대소문자 무시
grep -i "error" logs2/app.log
3) -r : 하위 디렉토리까지 재귀적으로 검색
grep -rn "INFO" logs2
-r, -n, -i 조합은 로그 검색의 필수 기본기.
실습 11 — cut + CSV 파일로 컬럼 추출
먼저 CSV 파일을 하나 만든다:
cat << 'EOF' > users.csv
id,name,age,city
1,Alice,30,Seoul
2,Bob,25,Busan
3,Charlie,35,Incheon
EOF
쉼표로 구분된 1,3번째 컬럼만 보기
cut -d',' -f1,3 users.csv
- -d',' : 구분자를 , 로 지정
- -f1,3 : 1번, 3번 컬럼 선택
CSV, 로그, 간단한 텍스트 데이터 전처리에 매우 자주 사용.
실습 12 — awk 기초 (컬럼 기반 처리)
users.csv 를 다시 활용:
awk -F',' '{print $1, $2}' users.csv
- -F',' : 구분자 comma
- $1, $2 : 첫 번째, 두 번째 컬럼
헤더를 제외하고 나이(age) 30 이상인 유저만 출력:
awk -F',' 'NR>1 && $3 >= 30 {print $2, $3}' users.csv
- NR>1 : 첫 줄(헤더) 제외
- $3 >= 30 : 3번째 컬럼(age)이 30 이상인 행만 선택
grep 이 “문자열 검색”이라면, awk는 “컬럼 단위 데이터 처리”에 강함.
실습 13 — view (읽기 전용 vim)
view 는 사실상 vim -R (read-only 모드)와 같다.
view users.csv
특징:
- 파일 내용을 읽기 전용으로 열기
- 실수로 수정하는 것을 방지하고 싶을 때 사용
- vim 안에서도 :view 나 :set readonly 등을 사용할 수 있음
로그 파일이나 설정 파일을 “보기만” 할 때 유용.
실습 14 — history / !! / !n / history | grep
전체 히스토리:
history
특정 명령어만 보기:
history | grep tar
history | grep python
직전 명령 재실행:
!!
히스토리 번호로 실행:
!25
자주 쓰는 긴 명령을 반복할 때 생산성이 크게 올라감.
실습 15 — uptime (서버 가동 시간 / 부하 확인)
uptime
예시 출력:
10:23:45 up 5 days, 3:12, 2 users, load average: 0.12, 0.08, 0.05
- up 5 days : 5일 동안 꺼지지 않고 동작 중
- load average : 최근 1분 / 5분 / 15분 평균 부하
운영 중인 서버의 상태를 빠르게 파악할 수 있는 간단하지만 유용한 명령어.
실습 16 — 서비스 관리 (service + nginx)
Docker Ubuntu 환경에서는 systemctl 이 동작하지 않으므로
service 로 nginx 를 테스트한다.
설치:
❯ docker run -it -p 8080:80 --name test-nginx ubuntu:24.04
apt update && apt install -y nginx
상태 확인:
service nginx status
시작 / 중지 / 재시작:
service nginx start
service nginx stop
service nginx restart
실습 17 — Docker 환경에서 nginx 띄우고 접속하기
1) nginx가 설치된 Ubuntu 컨테이너를 직접 띄우는 경우
✔ Ubuntu 컨테이너 실행 (포트 매핑 포함)
docker run -it -p 8080:80 --name ubuntu-nginx ubuntu:24.04
옵션 설명
- -i : interactive, 표준 입력 유지
- -t : TTY 할당 → bash 접근 가능
- -p 8080:80 :
- 호스트 8080 → 컨테이너 80
- 브라우저에서 http://localhost:8080 접속 가능
- --name ubuntu-nginx : 컨테이너 이름 지정
- ubuntu:24.04 : 사용할 이미지
✔ 컨테이너 내부에서 nginx 설치 및 실행
apt update && apt install -y nginx
nginx
✔ 프로세스 확인
ps aux | grep nginx
✔ 호스트에서 접속 테스트
curl localhost:8080
브라우저:
http://localhost:8080
2) nginx 공식 이미지 사용 (추천 패턴)
실무에서는 Ubuntu 이미지를 쓰기보다는, nginx 공식 이미지를 바로 실행하는 경우가 훨씬 많다.
✔ nginx 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx nginx
옵션 설명
- -d : detached mode
- 컨테이너를 백그라운드에서 실행
- nginx 같은 웹 서버는 계속 실행되어야 하므로 필수적
- 터미널이 즉시 반환되어 다른 명령을 계속 입력할 수 있음
- -p 8080:80 : 호스트 8080 → 컨테이너 80
- --name my-nginx : 컨테이너 이름
- nginx : Docker Hub 공식 nginx 이미지
✔ 접속 테스트
curl localhost:8080
브라우저에서도:
http://localhost:8080
✔ 로그 확인
docker logs -f my-nginx
- -f: tail -f 처럼 실시간 로그 스트림 보기
✔ 컨테이너 안으로 들어가기
docker exec -it my-nginx bash
✔ 종료 및 삭제
docker stop my-nginx
docker rm my-nginx
-d 옵션을 사용하는 이유
실행 방식명령 예설명
| 포그라운드 | docker run -it ubuntu | 컨테이너와 터미널이 붙어서 별도 작업 어려움 |
| 백그라운드(-d) | docker run -d nginx | nginx가 백그라운드 데몬처럼 계속 실행, 터미널은 계속 사용 가능 |
→ nginx, API 서버, DB 등 “지속 실행형 서비스”에는 -d 옵션이 거의 필수
종합 미션
- du + df를 이용해 현재 디스크 상태를 점검해보고, 용량이 가장 큰 디렉토리 3개를 찾아보세요.
- myapp 폴더를 tar.gz와 zip 두 가지 포맷으로 압축하고, 다시 풀어보세요.
- users.csv에서 cut과 awk를 이용해 (이름, 나이) 목록만 뽑아보세요.
- logs2 디렉토리에서 grep -rn -i "error" 로 에러 로그 위치를 찾아보세요.
- view를 사용해서 users.csv를 읽기 전용으로 열고, less로 big.log를 살펴본 뒤, uptime으로 서버 상태를 확인해보세요.
시간이 없어서 모든 파트를 모두 실습하고 이해하고 넘어가진 못하고 4번?정도까지만 했다.
특강이었어서 단발적으로 오시는 강사님이 해주셨는데 우리 진도를 조금 착각하고 오셔서 더 나간줄 아셔서 현재 실습하기에 어려운 부분들이 조금 있었다.
이 페이지는 계속 진도 나가면서 다시 와서 보고 실습도 해보고 해야 할 것 같다.
그래도 리눅스에 대해서 이렇게 명령어 폴더 옮기고 복사하고 생성하고 이런 과정들을 수업중에 그냥 넘어가는게 아니라 제대로 설명듣고 실습하고 이해하면서 넘어가서 이제야 약간이나마 손에 익는 느낌이었다.
하루하루 맨날 이해 안가도 저번에 했던 것들이 생각나면서 아 그래서 그렇게 했구나.
이 명령어는 이쪽이랑 붙이고 들어갈 때 쓰는 거구나, 등등 과거의 기억들이 다시금 새겨지면서 기억에 남는 경험을 했다.
이제 이런걸 더 손에 익히고 자연스레 사용할 수 있도록 명령어와 알고리즘 공부등등을 더 열심히 해야지
우린 아직 ubuntu 도커 붙는데에도 애로사항이 많다 ㅎ