SPACE LOGBOOK

OCEAN LOGBOOK

터미널 CLI, Linux와 Claude code

2026.05.16

터미널 CLI, Linux와 Claude code

2026.05.16
터미널 두렵지 않아요 — 리눅스 용어 완전 해설
LINUX · TERMINAL · BEGINNER TO MID

터미널 두렵지 않아요
리눅스 용어 완전 해설

초보자부터 중급자까지 — 실무에서 바로 써먹는 명령어와 에러 해결법
01 터미널이란 무엇인가

터미널(Terminal)은 텍스트 명령어로 컴퓨터에게 직접 지시를 내리는 인터페이스입니다. 우리가 평소 쓰는 GUI(그래픽 인터페이스)는 마우스로 아이콘을 클릭하는 방식이라면, 터미널은 타이핑으로 명령을 내리는 방식이에요.

비유: GUI는 리모컨으로 TV를 조작하는 것, 터미널은 TV 내부 회로에 직접 명령어를 입력하는 것. 더 번거롭지만 훨씬 강력하고 정밀하게 제어할 수 있어요.

왜 터미널을 써야 할까요? 서버(클라우드)에는 화면이 없어요. AWS, Lightsail 같은 클라우드 서버에 접속할 때 GUI가 없으니 터미널이 유일한 조작 수단이에요. 또한 반복 작업을 자동화하거나, 빠르게 파일을 수정할 때 터미널이 훨씬 효율적입니다.

터미널 = 쉘(Shell) = 콘솔 — 다 같은 말이에요. 리눅스 기본 쉘은 bash(배쉬)이고, macOS는 zsh를 씁니다. Windows는 CMD, PowerShell이 있어요.
▸ 터미널 기본 구조
your-user@ip-172-31-0-1:/home/your-user/your-project$ ls ┌─ 사용자명 ─┬─ 서버 이름 ─┐ ┌─ 현재 경로 ─────────────────┐ $ = 일반 사용자 프롬프트 ubuntu ip-172-31-0-1 /home/your-user/your-project # = root(관리자) 프롬프트
02 왜 터미널을 쓰는가 — GUI 도구와 비교

“서버 관리 GUI 툴도 있는데 왜 굳이 터미널을 써야 하나요?” — 정말 좋은 질문이에요. 결론부터 말하면, GUI 툴은 편리하지만 터미널이 더 강력하고 자유롭고 비용이 없습니다.

GUI 서버 관리 도구들 — 어떤 것들이 있나요?

도구종류비용특징
Webmin웹 기반 서버 관리무료브라우저로 서버 파일·서비스 관리. 설치 필요
Plesk웹 호스팅 패널유료 (월 $10~)웹사이트·도메인·DB 관리. 가장 대중적인 유료 패널
cPanel웹 호스팅 패널유료 (월 $15~)공유호스팅에서 많이 씀. 직관적 UI
PortainerDocker 관리 GUI무료(기본)Docker 컨테이너를 웹에서 관리
FileZillaFTP/SFTP 파일 전송무료로컬↔서버 파일 전송 GUI. 드래그&드롭 가능
MobaXtermSSH 클라이언트무료(개인)Windows에서 SSH + 파일 탐색기 동시 제공
VS Code Remote SSH코드 편집기무료서버 파일을 로컬 VS Code로 편집. 매우 편리
AWS 콘솔클라우드 관리 패널무료(서비스 비용 별도)EC2·Lightsail 등 AWS 리소스를 웹에서 관리

그럼에도 터미널을 쓰는 이유

① 완전 무료 — 항상, 어디서나
터미널은 리눅스에 기본 내장된 기능이에요. 별도 설치도, 구독료도, 라이선스도 필요 없어요. Plesk나 cPanel은 서버 비용과 별개로 매달 수만 원의 추가 비용이 발생해요.
② GUI가 없는 환경에서도 작동
AWS Lightsail, EC2 같은 클라우드 서버는 기본적으로 화면(디스플레이)이 없어요. GUI 툴을 쓰려면 별도 설정이 필요하지만, 터미널은 SSH 접속만 되면 즉시 모든 작업이 가능합니다. 서버가 부팅 직후거나, 화면이 없는 임베디드 환경이어도 마찬가지예요.
③ 모든 작업이 가능 — GUI는 만든 기능만 됨
GUI 패널은 개발사가 만들어둔 기능만 쓸 수 있어요. 하지만 터미널은 운영체제의 모든 기능에 직접 접근할 수 있어요. 특정 조건의 파일만 골라서 삭제하거나, 로그에서 특정 패턴만 추출하는 등 세밀한 작업은 터미널만이 가능합니다.
④ 자동화 — 반복 작업을 스크립트로
터미널 명령어들은 파일(.sh 스크립트)에 저장해두면 버튼 하나로 수십 개의 작업을 한번에 실행할 수 있어요. 매일 DB 백업, 로그 정리, 서버 상태 점검 같은 반복 작업을 자동화할 수 있습니다. GUI로는 이런 자동화가 불가능하거나 매우 제한적이에요.
# 예시: 매일 자동으로 DB 백업하는 스크립트 (crontab 등록) #!/bin/bash cp /home/your-user/your-project/server/database.sqlite \ /home/your-user/backup/db_$(date +%Y%m%d).sqlite echo “백업 완료: $(date)”
⑤ 빠름 — GUI보다 훨씬 빠른 응답
GUI는 화면을 그려야 하고 마우스 클릭 여러 번이 필요해요. 터미널은 텍스트만 주고받으니 느린 네트워크 환경에서도 빠르게 반응해요. 파일 이름 변경 하나를 GUI로 하면 클릭 3번, 터미널은 mv 명령어 한 줄이면 끝이에요.
⑥ 리소스를 거의 안 씀
GUI 패널(Webmin, cPanel 등)은 서버에서 별도 프로세스를 계속 실행시켜야 해요. 그만큼 메모리와 CPU를 소모하죠. 터미널은 접속할 때만 SSH 연결을 쓰고, 명령어 실행이 끝나면 자원을 즉시 돌려줘요.
⑦ 보안 — 노출 면적이 적음
Webmin이나 cPanel은 웹 포트(80, 443, 또는 별도 포트)를 추가로 열어야 해요. 이 포트가 해킹 공격의 표적이 될 수 있어요. 터미널(SSH)은 포트 하나만 열면 되고, PEM 키 파일로 인증하니 보안상 훨씬 안전합니다.
⑧ AI 도구와의 궁합
Claude Code, GitHub Copilot 같은 AI 코딩 도구들은 터미널 명령어를 직접 생성하고 실행할 수 있어요. GUI 툴은 AI가 자동으로 클릭해줄 수 없지만, 터미널 명령어는 AI가 생성한 코드를 바로 붙여넣어 실행할 수 있어요.

터미널 vs GUI — 언제 뭘 쓸까?

상황추천이유
서버 파일 대량 수정/검색터미널grep, sed, find 조합이 훨씬 빠름
로컬↔서버 파일 전송 (가끔)FileZilla (GUI)드래그&드롭이 편리
서버 로그 실시간 모니터링터미널tail -f 가 가장 직접적
WordPress 플러그인 관리WP 관리자 패널 (GUI)이미 좋은 GUI가 있음
서버 코드 수정/배포터미널 + Claude CodeAI와 조합 최강
DB 내용 직접 조회 (가끔)DBeaver 등 GUI표 형태로 보기 편함
자동화 스크립트 실행터미널GUI로는 자동화 불가
서버 상태 한눈에 파악AWS 콘솔 (GUI)그래프/차트로 보기 좋음
결론: GUI와 터미널은 경쟁 관계가 아니에요. 상황에 맞게 같이 쓰는 게 가장 현명해요. 다만 서버 작업의 핵심은 여전히 터미널이고, GUI 툴은 보조 수단이에요.
03 Claude Code — 터미널 CLI가 최고인 이유

Claude Code는 Anthropic이 만든 AI 코딩 도구로, 터미널에서 직접 실행하는 CLI(Command Line Interface) 버전이 따로 있어요. claude.ai 브라우저에서 쓰는 것과 달리, 터미널에서 claude 명령어 하나로 실행하고 프로젝트 전체를 AI와 함께 다룰 수 있어요.

비유: claude.ai 브라우저는 AI와 대화하며 코드를 받아 직접 붙여넣는 방식. Claude Code 터미널은 AI가 내 컴퓨터에 앉아서 직접 파일을 열고, 수정하고, 실행까지 해주는 방식이에요.

Claude Code 터미널 버전이 최고인 이유 ①
— 파일을 직접 읽고 수정하고 실행한다

브라우저에서 claude.ai를 쓸 때는 코드를 복사해서 붙여넣고, 수정된 코드를 다시 복사해서 파일에 붙여넣는 번거로운 과정이 반복돼요. Claude Code 터미널은 이 과정이 없어요.

# Claude Code 터미널에서 이런 대화가 가능해요 $ claude 나: server/routes/contract.js 파일에서 PDF 생성할 때 한글 폰트 깨지는 문제 고쳐줘 Claude: server/routes/contract.js 파일을 읽고 있습니다… 문제를 찾았어요. fontFamily 설정이 누락됐네요. 수정하겠습니다. # → Claude가 직접 파일을 열어서 수정 후 저장까지 완료 # 복사·붙여넣기 없이 끝
핵심 차이: 브라우저 claude.ai = AI가 코드를 “알려줌” / Claude Code 터미널 = AI가 코드를 “직접 처리함”

Claude Code 터미널 버전이 최고인 이유 ②
— 프로젝트 전체 컨텍스트를 이해한다

claude.ai 브라우저에서는 파일을 하나씩 복사해서 올려야 해요. 프로젝트 구조, 다른 파일과의 연관관계를 AI가 파악하기 어렵죠.

Claude Code 터미널은 프로젝트 폴더 전체를 처음부터 스캔해요. server/app.js 가 routes/contract.js 를 어떻게 불러오는지, database.sqlite 스키마가 어떤지, package.json 의 의존성이 무엇인지 — 전부 파악한 상태에서 답변해줘요.

# 프로젝트 전체를 이해한 상태에서 작업 나: 새솔CRM에 세금계산서 발행 내역 조회 기능 추가해줘 Claude: 현재 프로젝트 구조를 확인했어요. – server/app.js → 라우터 등록 구조 파악 – server/database.sqlite → 기존 테이블 스키마 확인 – server/routes/ → 기존 라우터 패턴 파악 – client/src/ → 프론트엔드 컴포넌트 구조 확인 기존 패턴에 맞춰 다음 파일들을 생성/수정하겠습니다: 1. server/routes/taxInvoice.js (신규) 2. server/app.js (라우터 등록 추가) 3. client/src/TaxInvoice.jsx (신규) # → 실제로 파일 생성 및 수정 실행

Claude Code 터미널 버전이 최고인 이유 ③
— 명령어를 직접 실행한다

코드 수정만이 아니라 실제 리눅스 명령어도 Claude가 직접 실행할 수 있어요. 서버 배포, 패키지 설치, pm2 재시작까지 AI가 터미널을 손처럼 다뤄요.

나: 수정한 코드 서버에 배포하고 pm2 재시작해줘 Claude: 네, 진행하겠습니다. $ git add -A $ git commit -m “feat: 세금계산서 조회 기능 추가” $ git push origin main 이제 서버에서 당겨오고 재시작할게요. $ ssh -i your-key.pem your-user@your-server-ip $ cd /home/your-user/your-project $ git pull $ npm install $ pm2 restart your-app 배포 완료됐습니다. pm2 status 확인하겠습니다. ✓ your-app online ↺0 cpu: 0.2% mem: 48mb

Claude Code 터미널 버전이 최고인 이유 ④
— 에러를 즉시 보고 즉시 고친다

브라우저에서 에러가 나면 에러 메시지를 복사 → claude.ai 탭으로 이동 → 붙여넣기 → 답변 받기 → 코드 복사 → 파일에 붙여넣기 → 다시 실행 — 이 과정을 반복해야 해요.

Claude Code 터미널에서는 에러가 나는 순간 Claude가 바로 확인하고 고쳐요.

나: npm run start 해봐 Claude: $ npm run start Error: Cannot find module ‘../utils/pdfGenerator’ at Function.Module._resolveFilename 경로 오류네요. pdfGenerator.js 파일 위치를 확인하겠습니다. $ find . -name “pdfGenerator*” ./server/helpers/pdfGenerator.js 경로가 utils가 아니라 helpers였네요. 바로 수정할게요. # → 파일 수정 후 자동으로 npm run start 재실행 ✓ Server running on port 3000

Claude Code 터미널 버전이 최고인 이유 ⑤
— 대화 맥락이 프로젝트와 함께 유지된다

claude.ai 브라우저는 대화 세션이 끝나면 맥락이 사라져요. 다음날 다시 접속하면 처음부터 설명해야 해요.

Claude Code 터미널은 CLAUDE.md 파일에 프로젝트 설명, 구조, 규칙, 주의사항을 적어두면 — 매번 접속할 때마다 자동으로 읽고 시작해요. 프로젝트의 기억이 파일로 유지되는 거예요.

# CLAUDE.md 예시 (프로젝트 루트에 저장) # 새솔CRM 프로젝트 ## 기본 정보 – Node.js/Express/SQLite 기반 – 서버: your-user@your-server-ip (PM2: your-app) – DB: server/database.sqlite (MySQL 아님, SQLite) ## 코딩 규칙 – 한글 주석 사용 – 라우터는 server/routes/ 폴더에 분리 – 알림톡은 Aligo API 사용 (utils/aligo.js) ## 주의사항 – heredoc 사용 시 한글 인코딩 주의 – .env 파일 절대 git push 금지

Claude Code 터미널 vs claude.ai 브라우저 — 정직한 비교

비교 항목claude.ai 브라우저Claude Code 터미널
파일 직접 수정❌ 복사·붙여넣기 필요✅ 직접 읽고 수정
프로젝트 전체 이해△ 파일 하나씩 올려야 함✅ 폴더 전체 자동 스캔
명령어 실행❌ 불가✅ bash 명령어 직접 실행
에러 즉시 수정❌ 에러→복사→붙여넣기 반복✅ 에러 보는 즉시 수정
프로젝트 기억 유지△ 매번 설명 필요✅ CLAUDE.md로 영구 유지
여러 파일 동시 작업❌ 하나씩✅ 연관 파일 한번에
서버 배포 자동화❌ 명령어만 알려줌✅ 직접 실행
UI 편의성✅ 직관적 웹 인터페이스△ 터미널 익숙함 필요
빠른 질문·답변✅ 접속 바로 가능△ 프로젝트 경로 이동 필요
이미지/PDF 첨부✅ 드래그&드롭△ 경로 지정 필요
비용Pro 구독 ($20/월)API 사용량 기반 (다를 수 있음)

Claude Code 터미널의 대체불가한 강점 — 한마디로

claude.ai 브라우저는 “AI 조수에게 물어보는 것”이고,
Claude Code 터미널은 “AI 개발자가 내 옆에 앉아 직접 일하는 것”이에요.


복사·붙여넣기 없이, 에러를 보는 즉시, 프로젝트 전체를 이해한 상태에서, 파일 수정부터 서버 배포까지 — 모든 과정을 연속적으로 처리해요. 진짜 개발자처럼요.
진님의 워크플로우 팁: 설계·기획 → claude.ai 브라우저 / 코드 작성·수정·배포 → Claude Code 터미널. 이 조합이 현재 가장 효율적인 AI 개발 워크플로우예요.
04 기초 명령어 — 파일과 폴더 다루기 초급

pwd — 현재 위치 확인

Print Working Directory. 내가 지금 어느 폴더에 있는지 전체 경로를 알려줍니다. 터미널에서 길을 잃었을 때 제일 먼저 치는 명령어예요.

pwd /home/your-user/your-project
읽기 전용 명령어 — 아무리 써도 아무것도 바뀌지 않아요. 마음껏 써도 됩니다.

ls — 파일 목록 보기

List. 현재 폴더 안에 있는 파일과 하위 폴더 목록을 보여줍니다. Windows의 dir 명령어와 같아요.

ls # 기본 목록 ls -l # 상세 정보 (권한, 크기, 날짜) ls -la # 숨김 파일(.env 등)까지 포함 ls -lh # 파일 크기를 KB/MB 단위로 표시 ls /home/your-user # 특정 경로의 목록 보기
옵션의미
-l권한, 소유자, 크기, 날짜 포함 상세 출력
-a숨김 파일(. 으로 시작하는 파일) 포함
-h파일 크기를 사람이 읽기 좋게 (KB, MB)
-t수정 시간 순으로 정렬
-r역순으로 정렬

cd — 폴더 이동

Change Directory. 폴더를 이동할 때 씁니다.

cd /home/your-user/your-project # 절대 경로로 이동 cd server # 현재 위치 기준 상대 경로 cd .. # 한 단계 위 폴더로 cd ../.. # 두 단계 위로 cd ~ # 홈 디렉터리로 (언제나 안전한 탈출구) cd – # 이전에 있던 폴더로 돌아가기
~ (틸드)는 내 홈 디렉터리를 의미해요. your-user 라면 /home/your-user 와 같습니다.

mkdir — 폴더 만들기

Make Directory. 새 폴더를 만듭니다.

mkdir backup # backup 폴더 생성 mkdir -p a/b/c # 중간 폴더가 없어도 한번에 생성 mkdir -p logs/2026/05 # 실무에서 자주 쓰는 패턴

cp — 파일 복사

Copy. 파일이나 폴더를 복사합니다. 중요한 파일을 수정하기 전에 백업용으로 꼭 써두세요.

cp server.js server.js.bak # 파일 백업 복사 cp .env .env.backup # .env 백업 (서버 작업 전 필수 습관!) cp -r 폴더A 폴더B # 폴더 통째로 복사 (-r 필수) cp file.txt /home/your-user/backup/ # 다른 경로로 복사

mv — 파일 이동 / 이름 변경

Move. 파일을 다른 위치로 옮기거나 이름을 바꿉니다.

mv old_name.js new_name.js # 이름 변경 mv app.js /home/your-user/backup/ # 다른 폴더로 이동 mv *.log /var/log/ # .log 파일 전부 이동 (* 와일드카드)

rm — 파일 삭제 ⚠️

Remove. 파일이나 폴더를 삭제합니다. 리눅스에는 휴지통이 없어요. 삭제하면 복구가 안 됩니다.

rm file.txt # 파일 삭제 rm -i file.txt # 삭제 전 확인 묻기 (안전한 방법) rm *.log # 로그 파일 전부 삭제 rm -r 폴더명 # 폴더 삭제 rm -rf 폴더명 # 폴더 강제 삭제 (확인 없음) — 극도로 주의!
⚠️ rm -rf 는 복구 불가능한 삭제입니다. 실무에서 쓸 때는 경로를 두 번 확인하고, 가능하면 -i 옵션을 습관화하세요. “rm -rf /” 는 서버 전체를 날릴 수 있어요.

touch — 빈 파일 만들기

빈 파일을 만들거나, 파일의 수정 시간을 현재로 업데이트합니다.

touch newfile.js # 빈 파일 생성 touch .gitkeep # 빈 폴더를 git에 올릴 때 관례적으로 사용
05 파일 내용 보기와 검색 초급

cat — 파일 내용 출력

Concatenate. 파일 내용을 터미널에 바로 출력합니다. 짧은 파일 확인에 적합해요.

cat .env # 환경변수 파일 내용 보기 cat package.json # 패키지 정보 확인 cat -n server.js # 줄번호 포함 출력 cat file1 file2 # 두 파일 연이어 출력

less / more — 긴 파일 스크롤해서 보기

cat은 내용을 한번에 쏟아내기 때문에 긴 파일은 읽기 어려워요. less는 페이지 단위로 스크롤하며 볼 수 있어요.

less server.js # 스크롤하며 보기 (q 로 종료) less +G app.log # 파일 맨 끝부터 보기 more file.txt # less 의 구형 버전 (less가 더 편함)
less 안에서: 스페이스바 = 다음 페이지 / b = 이전 페이지 / /검색어 = 검색 / q = 종료

tail — 파일 끝부분 보기

로그 파일 마지막 줄을 확인하거나, 실시간으로 로그를 모니터링할 때 필수 명령어예요.

tail app.log # 마지막 10줄 출력 tail -n 50 app.log # 마지막 50줄 출력 tail -f app.log # 실시간으로 추가되는 내용 계속 출력 (Ctrl+C 로 중단) tail -f pm2.error.log # 서버 에러 실시간 모니터링
-f 옵션(follow)은 서버 로그를 실시간으로 보고 싶을 때 정말 유용해요. 서버에 문제 생겼을 때 제일 먼저 써보는 명령어입니다.

grep — 파일 안에서 검색

Global Regular Expression Print. 파일 안에서 특정 단어가 있는 줄만 골라서 보여줍니다. 로그 분석에 필수예요.

grep “error” app.log # 에러 포함된 줄만 출력 grep -i “error” app.log # 대소문자 구분 없이 검색 grep -n “PORT” .env # 줄번호 포함 grep -r “saesol” ./server # 폴더 안 모든 파일에서 검색 grep -v “debug” app.log # “debug” 포함되지 않은 줄만 출력 grep -c “error” app.log # 매칭된 줄 수 카운트 grep “error” app.log | grep “timeout” # 파이프로 중첩 검색

find — 파일 찾기

조건에 맞는 파일을 시스템 전체에서 찾습니다.

find . -name “*.log” # 현재 폴더에서 .log 파일 찾기 find /home -name “.env” # .env 파일 찾기 find . -name “*.js” -mtime -7 # 7일 이내 수정된 .js 파일 find . -size +10M # 10MB 이상 파일 찾기 find . -type d -name “node_modules” # 폴더 타입으로 찾기
06 편집기 없이 파일 만들기 — echo, heredoc, sed 초급~중급

서버에서 vi나 nano 같은 편집기를 매번 열기 번거롭고, Claude Code처럼 자동화된 환경에서는 편집기를 열 수도 없어요. 이럴 때 명령어 하나로 파일을 만들거나 수정하는 방법들을 알아봅시다.

echo — 텍스트 출력 / 한 줄 파일 쓰기

텍스트를 출력하거나 파일에 씁니다. 한 줄짜리 파일 작성이나 설정 추가에 편리해요.

echo “안녕하세요” # 터미널에 출력 echo “PORT=3000” > .env # 파일 새로 만들기 (기존 내용 덮어씀) echo “DB_PATH=./database.sqlite” >> .env # 파일 끝에 추가 echo “” >> .env # 빈 줄 추가 echo $HOME # 환경변수 값 출력 echo $PATH # PATH 환경변수 확인
> 는 덮어쓰기(기존 내용 삭제), >> 는 이어쓰기입니다. 실수로 > 를 쓰면 소중한 설정 파일이 날아갈 수 있어요!

heredoc — 여러 줄 파일 한번에 쓰기

EOF 구분자 사이의 내용을 통째로 파일에 씁니다. 여러 줄짜리 설정 파일을 한번에 만들 때 유용해요.

cat << ‘EOF’ > config.js const config = { port: 3000, dbPath: ‘./database.sqlite’, jwtSecret: ‘your-secret-key’ }; EOF # EOF 자리에 다른 단어도 가능 (DONE, END, HEREDOC 등 아무거나) cat << ‘DONE’ > nginx.conf server { listen 80; server_name example.com; } DONE
Windows CMD에서 SSH 접속 후 heredoc을 쓰면 한글이 깨질 수 있어요. 한글 포함 파일은 직접 편집하거나 파일을 서버로 업로드하는 게 안전합니다.

sed — 파일 내 텍스트 찾아 바꾸기

Stream EDitor. 파일을 열지 않고 명령어 한 줄로 특정 텍스트를 찾아 바꿉니다.

# 기본 문법: sed -i ‘s/찾을것/바꿀것/’ 파일명 sed -i ‘s/3000/8080/’ config.js # 포트번호 변경 sed -i ‘s/localhost/0.0.0.0/’ config.js # 호스트 변경 sed -i ‘s/production/development/g’ .env # g = 줄에서 모두 바꾸기 sed -i ‘5d’ file.txt # 5번째 줄 삭제 sed -i ‘1,3d’ file.txt # 1~3번째 줄 삭제 sed -n ‘10,20p’ file.txt # 10~20번째 줄만 출력 (-i 없으면 파일 안 바뀜) # macOS에서는 -i 뒤에 ”(빈 문자열) 필요 sed -i ” ‘s/3000/8080/’ config.js # macOS 버전

awk — 데이터 추출과 가공

텍스트 파일에서 특정 열(컬럼)만 추출하거나 가공할 때 씁니다. 로그 분석에 강력해요. 중급

awk ‘{print $1}’ access.log # 첫 번째 컬럼만 출력 (IP 주소 등) awk -F‘,’ ‘{print $2}’ data.csv # CSV에서 두 번째 컬럼 추출 awk ‘/error/{print}’ app.log # error 포함 줄만 출력 (grep과 유사) awk ‘{sum += $3} END {print sum}’ data.txt # 세 번째 컬럼 합계
07 프로세스 관리 중급

프로세스(Process)는 현재 실행 중인 프로그램을 의미해요. 서버가 정상 동작하는지, 메모리를 얼마나 쓰는지 확인하고 제어할 수 있어요.

ps — 실행 중인 프로세스 목록

ps aux # 모든 프로세스 목록 ps aux | grep node # node 관련 프로세스만 찾기 ps aux | grep pm2 # pm2 프로세스 확인 # 출력 컬럼 의미 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND # ubuntu 1234 0.5 2.1 … node app.js

top / htop — 실시간 시스템 모니터

top # 실시간 CPU/메모리 사용률 (q로 종료) htop # top의 보기 좋은 버전 (설치 필요: apt install htop)
top 안에서: q = 종료 / k = 프로세스 종료 / M = 메모리 사용량 순 정렬 / P = CPU 사용량 순 정렬

kill / killall — 프로세스 강제 종료

kill 1234 # PID 1234인 프로세스 종료 (ps 로 PID 확인) kill -9 1234 # 강제 종료 (무조건 죽임) killall node # node라는 이름의 프로세스 모두 종료

pm2 — Node.js 서버 프로세스 관리자

PM2는 Node.js 앱을 백그라운드에서 계속 실행시켜주는 프로세스 관리자예요. 새솔CRM 서버에서 핵심 도구입니다.

pm2 status # 실행 중인 앱 목록과 상태 pm2 start app.js # 앱 시작 pm2 start app.js –name saesol # 이름 지정해서 시작 pm2 stop your-app # 중지 pm2 restart your-app # 재시작 pm2 logs your-app # 실시간 로그 보기 pm2 logs your-app –lines 100 # 최근 100줄 로그 pm2 save # 현재 상태 저장 (서버 재부팅 후 자동 실행 설정) pm2 startup # 부팅 시 자동 시작 설정 명령어 출력

nohup & — 백그라운드 실행

터미널을 닫아도 프로그램이 계속 실행되게 합니다. pm2가 없을 때 임시방편으로 씁니다.

nohup node app.js & # 백그라운드에서 실행, 터미널 닫아도 유지 nohup node app.js > out.log & # 출력을 파일에 저장하며 백그라운드 실행
08 권한(Permission) 시스템 중급

리눅스는 파일마다 누가 읽고, 쓰고, 실행할 수 있는지 권한을 설정해요.

ls -l 하면 보이는 권한 표시: -rwxr-xr-x 1 ubuntu ubuntu 4096 2026-05-15 app.js ┌─ 파일 종류 (- : 파일 / d : 폴더 / l : 링크) │┌─ 소유자 권한 (r읽기 w쓰기 x실행) ││└─ 그룹 권한 │└─ └─ 기타 사용자 권한 rwx r-x r-x 소유자: 읽기+쓰기+실행 / 그룹: 읽기+실행 / 기타: 읽기+실행

chmod — 권한 변경

chmod 755 app.js # 소유자: 모두 / 그룹,기타: 읽기+실행 chmod 644 .env # 소유자: 읽기+쓰기 / 그룹,기타: 읽기만 chmod 600 private.key # 소유자만 읽기+쓰기 (SSH 키 파일에 필수) chmod +x script.sh # 실행 권한 추가 chmod -R 755 폴더/ # 폴더 전체 재귀 적용 # 숫자 계산법: r=4, w=2, x=1 → 더하면 됨 # 7 = 4+2+1 = rwx (모두) # 6 = 4+2 = rw- (읽기+쓰기) # 5 = 4+1 = r-x (읽기+실행) # 4 = 4 = r– (읽기만)

sudo — 관리자 권한으로 실행

SuperUser DO. 일반 사용자 권한으로는 안 되는 작업을 관리자(root) 권한으로 실행합니다.

sudo apt install nginx # 패키지 설치 (root 권한 필요) sudo systemctl restart nginx # 시스템 서비스 재시작 sudo -i # root 사용자로 전환 (exit으로 복귀) sudo !! # 이전 명령어를 sudo로 재실행 (권한 오류 났을 때)

chown — 파일 소유자 변경

chown ubuntu app.js # 소유자를 ubuntu로 변경 chown ubuntu:ubuntu app.js # 소유자:그룹 함께 변경 chown -R ubuntu:ubuntu 폴더/ # 폴더 전체 재귀 적용
09 네트워크 명령어 중급

ping — 서버 연결 확인

ping google.com # 인터넷 연결 확인 (Ctrl+C 로 중단) ping -c 4 google.com # 4번만 보내고 종료 ping your-server-ip # IP로 직접 확인

curl — URL로 데이터 요청

URL에 HTTP 요청을 보내고 결과를 받아봅니다. API 테스트, 파일 다운로드에 많이 써요.

curl https://api.example.com/health # GET 요청 curl -X POST https://api.example.com \ -H “Content-Type: application/json” \ -d ‘{“key”:”value”}’ # POST 요청 curl -o file.zip https://example.com/file.zip # 파일 다운로드 curl -I https://saesol-tax.com # 헤더만 확인 (상태코드 등) curl localhost:3000/api/test # 로컬 서버 API 테스트

ssh — 원격 서버 접속

ssh your-user@your-server-ip # 기본 접속 ssh -i your-key.pem your-user@your-server-ip # PEM 키 파일로 접속 ssh -p 9438 vinaida@your-nas-ip # 포트 지정 접속 (NAS) exit # 접속 종료

scp — 서버와 파일 주고받기

# 로컬 → 서버 업로드 scp -i your-key.pem local_file.js your-user@your-server-ip:/home/your-user/ # 서버 → 로컬 다운로드 scp -i your-key.pem your-user@your-server-ip:/home/your-user/app.log ./ # 폴더 전체 업로드 (-r) scp -r -i your-key.pem ./src your-user@your-server-ip:/home/your-user/

netstat / ss — 포트 사용 현황

ss -tlnp # 열려있는 포트 목록 (netstat보다 빠름) netstat -tlnp # 동일한 내용 (구형 시스템) ss -tlnp | grep 3000 # 3000번 포트 사용 여부 확인

wget — 파일 다운로드

wget https://example.com/file.zip # 파일 다운로드 wget -O output.zip https://example.com/f # 파일명 지정해서 다운로드 wget -q https://example.com/file # 조용히(quiet) 다운로드
10 파이프(|)와 리다이렉션(>, >>) 중급

리눅스의 진짜 강력함은 명령어를 조합하는 데 있어요. 파이프와 리다이렉션으로 명령어들을 연결할 수 있습니다.

| (파이프) — 명령어 연결

앞 명령어의 출력을 다음 명령어의 입력으로 넘겨줍니다.

ps aux | grep node # 프로세스 목록에서 node만 걸러냄 cat app.log | grep error # 로그에서 에러만 찾기 ls -la | grep “.js” # .js 파일만 목록에 표시 cat app.log | grep error | tail -20 # 에러 중 최근 20줄만 cat big.log | wc -l # 로그 파일 줄 수 카운트

> >> — 출력을 파일로 저장

ls -la > filelist.txt # 결과를 파일로 저장 (덮어쓰기) echo “PORT=3000” >> .env # 파일에 이어쓰기 cat app.log | grep error > errors.log # 에러만 별도 파일로 저장 # 에러 출력 리다이렉션 node app.js 2> error.log # 에러 메시지만 파일로 node app.js > out.log 2>&1 # 정상+에러 모두 파일로
기호이름동작
|파이프앞 명령어 출력 → 다음 명령어 입력으로 전달
>리다이렉션(덮어쓰기)결과를 파일에 저장 (기존 내용 삭제)
>>리다이렉션(이어쓰기)결과를 파일 끝에 추가
2>에러 리다이렉션에러 메시지를 파일에 저장
<입력 리다이렉션파일 내용을 명령어의 입력으로 사용
11 시스템 정보와 디스크 관리 중급

df — 디스크 사용량 확인

df -h # 디스크 사용량 (사람이 읽기 좋게) df -h / # 루트 디스크만 확인 # 출력 예: # Filesystem Size Used Avail Use% Mounted on # /dev/xvda1 30G 18G 12G 60% /

du — 폴더 크기 확인

du -sh ./ # 현재 폴더 전체 크기 du -sh * # 각 항목별 크기 du -sh node_modules # node_modules 크기 확인 du -sh * | sort -rh # 크기 큰 순으로 정렬

free — 메모리 사용량

free -h # 메모리 사용량 (사람이 읽기 좋게) # 출력 예: # total used free shared buff/cache available # Mem: 1.9G 980M 120M 2M 820M 920M # Swap: 1.0G 200M 800M

uname / uptime — 서버 기본 정보

uname -a # 커널 버전, 아키텍처 등 전체 정보 uptime # 서버 가동 시간, 현재 부하 hostname # 서버 이름 whoami # 현재 내가 누구인지 (사용자명) date # 현재 시간 timedatectl # 시간대 설정 확인
12 패키지 설치 초급

apt — Ubuntu 패키지 관리자

sudo apt update # 패키지 목록 갱신 (설치 전 항상 먼저) sudo apt install nginx # nginx 설치 sudo apt install htop git # 여러 패키지 한번에 sudo apt remove nginx # 패키지 삭제 sudo apt upgrade # 모든 패키지 업그레이드 apt search nginx # 패키지 검색

npm — Node.js 패키지 관리자

npm install # package.json 기반 패키지 설치 npm install express # express 설치 npm install -g pm2 # 전역 설치 (어디서나 쓸 수 있게) npm update # 패키지 업데이트 npm list # 설치된 패키지 목록 npm run start # package.json의 start 스크립트 실행
13 환경변수와 .env 중급

환경변수(Environment Variable)는 시스템 전체에서 참조할 수 있는 변수예요. DB 접속 정보, API 키 같은 민감한 정보를 코드에 직접 쓰지 않고 환경변수로 관리합니다.

export PORT=3000 # 환경변수 설정 (현재 세션만) echo $PORT # 환경변수 값 확인 env # 모든 환경변수 목록 env | grep PORT # PORT 관련 환경변수 찾기 unset PORT # 환경변수 삭제
# .env 파일 예시 (Node.js 프로젝트) NODE_ENV=production PORT=3000 DB_PATH=./server/database.sqlite JWT_SECRET=your-secret-key TELEGRAM_TOKEN=123456:ABC-DEF CLAUDE_API_KEY=sk-ant-api03-…
.env 파일은 절대 git에 올리면 안 돼요. .gitignore에 반드시 포함시키세요.
14 자주 겪는 에러 상황과 해결법

에러 메시지가 나오면 당황하지 마세요. 컴퓨터가 친절하게 뭐가 잘못됐는지 알려주는 거예요. 자주 마주치는 에러들을 정리했습니다.

-bash: command not found
원인: 명령어가 설치되어 있지 않거나, 철자가 틀렸을 때
which 명령어로 설치 여부 확인 → which node, which pm2
설치 안 됐으면 apt install 또는 npm install -g 로 설치
철자 오타 확인 (pm2 → pm2, nide → node 등)
Permission denied
원인: 현재 사용자가 해당 파일/폴더에 접근 권한이 없을 때
sudo 붙여서 다시 실행 → sudo 명령어
파일 권한 확인 → ls -la 파일명
SSH 키 파일 권한 문제라면 → chmod 600 your-key.pem
No such file or directory
원인: 경로가 틀렸거나 파일이 실제로 없을 때
pwd 로 현재 위치 확인
ls 로 해당 폴더에 파일이 실제 있는지 확인
경로에 오타가 없는지 확인 (대소문자 구분!)
EADDRINUSE: address already in use :::3000
원인: 3000번 포트를 이미 다른 프로세스가 사용 중일 때
ss -tlnp | grep 3000 으로 어떤 프로세스가 쓰는지 확인
kill -9 [PID번호] 로 해당 프로세스 종료
또는 pm2 restart 로 재시작 (pm2가 포트 관리해줌)
ENOENT: no such file or directory, open ‘.env’
원인: .env 파일이 없거나 다른 경로에 있을 때
ls -la | grep .env 로 파일 존재 확인
pwd 로 현재 위치가 프로젝트 루트인지 확인
echo “PORT=3000” > .env 로 새로 만들기
Cannot find module ‘express’
원인: npm 패키지가 설치되지 않았을 때
npm install 실행 (package.json 기반 전체 설치)
node_modules 폴더가 있는지 ls 로 확인
없으면 npm install express 로 개별 설치
Error: connect ECONNREFUSED 127.0.0.1:3000
원인: 서버가 실행되지 않았거나 포트가 다를 때
pm2 status 로 서버 상태 확인
서버가 stopped면 pm2 restart 실행
pm2 logs 로 서버 시작 오류 내용 확인
disk quota exceeded / No space left on device
원인: 서버 디스크가 꽉 찼을 때
df -h 로 디스크 사용량 확인
du -sh * | sort -rh 로 큰 폴더/파일 찾기
로그 파일이나 오래된 백업 파일 정리
node_modules 재설치: rm -rf node_modules && npm install
ssh: connect to host your-server-ip port 22: Connection refused
원인: SSH 포트가 다르거나, 서버가 꺼져 있거나, 방화벽 차단
포트 확인 → ssh -p 22 또는 다른 포트 시도
AWS 콘솔에서 보안 그룹(Security Group) 인바운드 규칙 확인
서버 상태를 AWS 콘솔에서 확인 (Running 상태인지)
WARNING: UNPROTECTED PRIVATE KEY FILE!
원인: PEM 키 파일의 권한이 너무 개방적일 때 (0644 이상)
chmod 600 your-key.pem 으로 권한 제한
이후 다시 ssh 접속 시도
bash: syntax error near unexpected token
원인: 명령어 문법 오류. 따옴표 미완성, 괄호 누락 등
명령어를 처음부터 다시 입력
따옴표(‘ ” )가 쌍으로 맞는지 확인
heredoc의 EOF가 닫혀있는지 확인
killed (OOM — Out of Memory)
원인: 메모리 부족으로 프로세스가 강제 종료됨
free -h 로 메모리 상태 확인
불필요한 프로세스 종료
서버 플랜 업그레이드 검토
swap 메모리 설정 (임시방편)
15 터미널 황금 규칙 요약
  1. 읽기 명령어는 마음껏 써도 안전해요. pwd, ls, cat, grep, tail, ps — 이것들은 아무리 써도 파일이나 서버가 바뀌지 않아요. 적극적으로 활용하세요.
  2. 에러 메시지는 친구예요. 빨간 글씨가 나와도 당황하지 마세요. 메시지를 그대로 복사해서 검색하거나 AI에게 물어보면 대부분 해결돼요.
  3. Ctrl + C 는 비상탈출구. 뭔가 잘못 실행되거나 멈추지 않을 때 Ctrl+C 누르면 즉시 중단돼요.
  4. 중요한 파일은 수정 전에 백업. cp .env .env.bak 처럼 항상 백업 복사본을 만들어두세요.
  5. rm -rf 딱 하나만 조심. 나머지 명령어는 실수해도 대부분 복구 가능하지만, rm -rf는 복구 불가능해요.
  6. 모르는 명령어는 –help 로. 명령어 뒤에 –help 또는 man 명령어를 붙이면 사용법이 나와요.
  7. 탭(Tab) 자동완성을 적극 활용하세요. 긴 경로나 파일명을 타이핑하다 Tab을 누르면 자동완성돼요. 오타도 줄이고 빠르게 입력할 수 있어요.
  8. 방향키 ↑↓ 로 이전 명령어 재사용. 위 방향키를 누르면 이전에 입력한 명령어가 나와요. history 명령어로 전체 목록도 볼 수 있어요.

▸ 자주 쓰는 명령어 한눈에 보기
# 위치/탐색 pwd 현재 위치 ls -la 파일 목록 cd ~ 홈으로 # 파일 관리 cat 내용 보기 tail -f 실시간 로그 grep 검색 cp 복사 mv 이동/이름변경 mkdir -p 폴더생성 # 서버 관리 pm2 status 상태확인 pm2 logs 로그보기 pm2 restart 재시작 df -h 디스크 free -h 메모리 ps aux 프로세스 # 파일 편집 (편집기 없이) echo “내용” >> 파일 이어쓰기 sed -i ‘s/A/B/’ 파일 찾아바꾸기 grep “검색어” 파일 | tail -20 검색 후 최근 20줄 # 비상탈출 Ctrl+C 실행 중단 cd ~ 홈으로 도망 exit 접속 종료
터미널은 도구예요. 칼이 무섭다고 요리를 못하진 않잖아요.
쓰다 보면 익숙해집니다. ✦

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 기록은 여기까지지만,
생각은 아직 이동 중이다