리눅스 커맨드 라인 인터페이스(CLI)는 단순히 검은 화면에 흰 글씨를 입력하는 공간이 아닙니다. 이것은 개발자가 운영체제와 직접 소통하며, 복잡한 작업을 단순한 명령어의 조합으로 해결하는 강력한 작업 공간입니다. 그래픽 사용자 인터페이스(GUI)가 제공하는 직관적인 편리함도 분명 가치가 있지만, CLI는 반복 작업을 자동화하고, 여러 도구를 유기적으로 연결하며, 서버 자원을 효율적으로 관리하는 데 있어 비교할 수 없는 생산성과 유연성을 제공합니다. 많은 개발자들이 리눅스 환경을 선호하는 이유는 바로 이 CLI의 강력함 때문입니다. 키보드에서 손을 떼지 않고도 파일 시스템을 탐색하고, 텍스트 데이터를 가공하며, 프로세스를 제어하고, 원격 서버를 관리하는 일련의 과정은 개발의 흐름을 끊지 않고 사고의 속도를 따라잡게 해줍니다.
이 글에서는 단순히 20가지 명령어를 나열하고 그 기능을 설명하는 데 그치지 않을 것입니다. 대신, 각 명령어가 유닉스 철학, 즉 '하나의 도구는 한 가지 일을 잘해야 한다(Do One Thing and Do It Well)'는 원칙에 어떻게 부합하는지, 그리고 이 작은 도구들이 어떻게 서로 연결되어 복잡한 파이프라인을 구축하는지를 탐구할 것입니다. ls로 파일을 보고, grep으로 원하는 내용을 찾고, sed로 수정하며, xargs로 다른 명령어에 전달하는 흐름을 이해하는 것은 개발자로서 문제 해결 능력을 한 차원 높이는 계기가 될 것입니다. 이제, 여러분의 생산성을 극대화하고 서버와 코드를 자유자재로 다룰 수 있게 해줄 핵심적인 리눅스 명령어의 세계로 깊이 들어가 보겠습니다.
1. 파일 시스템 탐색과 기본 조작: 모든 작업의 시작
개발 작업은 언제나 파일과 디렉터리에서 시작됩니다. 소스 코드를 찾고, 설정 파일을 열고, 로그 파일이 저장된 위치로 이동하는 것은 일상적인 활동입니다. 따라서 파일 시스템을 빠르고 정확하게 탐색하는 능력은 기본 중의 기본입니다. CLI는 마우스 클릭보다 훨씬 효율적인 탐색 경험을 제공합니다.
ls: 현재 위치의 내용 확인하기
ls(list)는 가장 기본적이고 빈번하게 사용되는 명령어입니다. 현재 디렉터리에 어떤 파일과 하위 디렉터리가 있는지 보여줍니다. 하지만 ls의 진정한 힘은 다양한 옵션에 있습니다.
$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
단순히 ls만 입력하면 파일 및 디렉터리 이름만 간략하게 보여줍니다. 개발자에게는 더 많은 정보가 필요합니다. 여기서 -l (long format) 옵션이 등장합니다. 이 옵션은 파일 권한, 소유자, 그룹, 파일 크기, 마지막 수정일 등 상세 정보를 함께 출력하여 파일의 메타데이터를 한눈에 파악하게 해줍니다.
$ ls -l
total 48
drwxr-xr-x 2 user user 4096 Oct 28 10:15 Desktop
drwxr-xr-x 5 user user 4096 Oct 27 15:30 Documents
-rw-r--r-- 1 user user 8980 Oct 26 20:01 my_script.py
위 출력에서 -rw-r--r--는 파일 권한을, user user는 소유자와 그룹을, 8980은 파일 크기(바이트 단위)를, Oct 26 20:01은 마지막 수정 시간을 의미합니다. 이 정보만으로도 파일의 상태를 대략적으로 짐작할 수 있습니다.
여기에 몇 가지 유용한 옵션을 더 조합해 보겠습니다.
-a(all):.bashrc나.git처럼 점(.)으로 시작하는 숨김 파일 및 디렉터리까지 모두 보여줍니다. 프로젝트의 Git 설정이나 개인 환경 설정 파일을 확인할 때 필수적입니다.-h(human-readable): 파일 크기를 K(킬로바이트), M(메가바이트), G(기가바이트) 등 사람이 읽기 쉬운 단위로 표시해줍니다.-l옵션과 함께 사용하여ls -lh형태로 많이 쓰입니다.-t: 파일을 마지막 수정 시간 순서(최신 파일이 위로)로 정렬합니다. 방금 수정한 로그 파일이나 소스 코드를 빠르게 찾을 때 매우 유용합니다.-R(recursive): 현재 디렉터리뿐만 아니라 모든 하위 디렉터리의 내용까지 재귀적으로 보여줍니다. 프로젝트 전체의 파일 구조를 파악할 때 유용하지만, 파일이 많은 경우 출력이 매우 길어질 수 있습니다.
개발자 워크플로우 예시: 최근에 작업한 로그 파일을 찾고 싶을 때, ls -lht /var/log 명령어를 사용하면 로그 파일들이 최신순으로, 사람이 읽기 쉬운 크기와 함께 정렬되어 나타나므로 원하는 파일을 즉시 찾을 수 있습니다.
. ├── documents │ └── report.docx ├── source_code │ ├── main.py │ └── utils.py └── .config (hidden)
cd: 작업 디렉터리 변경하기
cd(change directory)는 쉘의 현재 작업 위치를 다른 디렉터리로 변경하는 명령어입니다. 파일 시스템을 탐색하는 가장 핵심적인 도구입니다.
# /home/user/projects/web-app 디렉터리로 이동
$ cd /home/user/projects/web-app
# 현재 위치에서 src 하위 디렉터리로 이동
$ cd src
# 상위 디렉터리로 이동
$ cd ..
# 바로 이전 작업 디렉터리로 돌아가기
$ cd -
# 인자 없이 사용하면 홈 디렉터리로 이동
$ cd
cd -는 특히 유용합니다. 두 개의 다른 디렉터리를 번갈아 가며 작업할 때, 전체 경로를 다시 입력할 필요 없이 간단히 이전 위치로 돌아갈 수 있어 작업 효율을 크게 높여줍니다.
대부분의 쉘에서는 탭(Tab) 키를 이용한 자동 완성 기능을 지원합니다. cd pro까지 입력하고 탭 키를 누르면 projects로 자동 완성되어 오타를 줄이고 입력 속도를 높일 수 있습니다.
pwd: 현재 위치 확인하기
pwd(print working directory)는 현재 작업 중인 디렉터리의 전체 경로를 출력합니다. 복잡한 디렉터리 구조 속에서 현재 위치를 잃었을 때, 혹은 스크립트 내에서 현재 경로를 기준으로 상대 경로를 계산해야 할 때 유용하게 사용됩니다.
$ pwd
/home/user/projects/web-app/src/main
이 명령어는 단순하지만, 현재 작업의 '문맥(context)'을 명확히 해주는 중요한 역할을 합니다.
cp, mv, rm: 파일과 디렉터리 관리
이 세 명령어는 파일과 디렉터리를 복사, 이동(이름 변경 포함), 삭제하는 기본 도구입니다.
cp(copy): 파일이나 디렉터리를 복사합니다.
중요한 설정 파일을 수정하기 전에# source.txt 파일을 destination.txt 파일로 복사 $ cp source.txt destination.txt # 디렉터리를 복사할 때는 -r (recursive) 옵션이 필요 $ cp -r source_dir/ destination_dir/cp config.yml config.yml.bak과 같이 백업본을 만들어두는 것은 좋은 습관입니다.mv(move): 파일이나 디렉터리를 다른 위치로 이동시키거나, 같은 위치에서 이름을 변경하는 데 사용됩니다.# file.txt를 /tmp 디렉터리로 이동 $ mv file.txt /tmp/ # old_name.txt를 new_name.txt로 이름 변경 $ mv old_name.txt new_name.txtmv는 원자적(atomic) 연산으로 이루어지는 경우가 많아, 대용량 파일을 복사 후 삭제하는 것보다 훨씬 빠릅니다.rm(remove): 파일이나 디렉터리를 삭제합니다. 이 명령어는 휴지통을 거치지 않고 영구적으로 삭제하므로 사용에 각별한 주의가 필요합니다.# file.txt 삭제 $ rm file.txt # 비어있지 않은 디렉터리를 삭제하려면 -r (recursive) 옵션 필요 $ rm -r old_project/ # 삭제 여부를 묻지 않고 강제로 삭제하려면 -f (force) 옵션 사용 (매우 위험!) $ rm -rf /some/directoryrm -rf /와 같은 명령어는 시스템 전체를 파괴할 수 있으므로,-rf옵션은 정말로 무엇을 삭제하는지 명확히 알고 있을 때만 사용해야 합니다.
2. 텍스트 데이터 처리: 개발자의 핵심 역량
개발자는 코드, 로그, 설정 파일, 데이터 파일 등 수많은 텍스트 데이터를 다룹니다. 이 데이터를 효율적으로 보고, 검색하고, 수정하는 능력은 개발 생산성과 직결됩니다. 리눅스는 텍스트 처리를 위한 강력한 도구들을 제공합니다.
cat, less, tail: 파일 내용 확인하기
파일 내용을 확인하는 방법은 파일의 크기와 목적에 따라 다릅니다.
cat(concatenate): 파일의 내용을 화면에 그대로 출력합니다. 주로 짧은 파일의 내용을 빠르게 확인하거나, 여러 파일을 합쳐서 하나의 출력으로 만들 때 사용됩니다.# config.json 파일 내용 전체 출력 $ cat config.json # part1.txt와 part2.txt를 합쳐 full.txt 파일 생성 $ cat part1.txt part2.txt > full.txtcat은 파일 전체를 메모리에 올리므로, 수 기가바이트에 달하는 로그 파일에 사용하면 시스템에 부하를 줄 수 있습니다.less: 대용량 파일을 위한 페이저(pager) 프로그램입니다. 파일 전체를 읽지 않고 화면에 보여줄 부분만 읽어오므로 매우 빠르고 효율적입니다.$ less /var/log/syslogless내부에서는 화살표 키로 스크롤,/키로 검색,q키로 종료 등 다양한 상호작용이 가능합니다. 대용량 로그 파일을 분석할 때 필수적인 도구입니다.tail: 파일의 마지막 부분을 출력합니다. 기본값으로 마지막 10줄을 보여줍니다.# access.log 파일의 마지막 10줄 보기 $ tail access.log # 마지막 50줄 보기 $ tail -n 50 access.logtail의 가장 강력한 기능은-f(follow) 옵션입니다. 이 옵션을 사용하면 파일에 새로운 내용이 추가될 때마다 화면에 실시간으로 업데이트하여 보여줍니다. 서버 로그를 실시간으로 모니터링할 때 절대적으로 필요한 기능입니다.# app.log 파일 실시간 감시 $ tail -f app.log
grep: 텍스트에서 패턴 검색하기
grep(Global Regular Expression Print)은 텍스트 파일이나 표준 입력에서 특정 패턴(문자열 또는 정규 표현식)과 일치하는 줄을 찾아 출력하는 막강한 도구입니다. 개발자에게 grep은 코드베이스에서 특정 함수가 사용된 위치를 찾거나, 로그 파일에서 특정 에러 메시지를 검색하는 등 없어서는 안 될 존재입니다.
+--------------------------------+ | Large Log File | | ... | | INFO: User logged in | | DEBUG: Processing request | | ERROR: NullPointerException | ---> [ grep "ERROR" ] ---> ERROR: NullPointerException | INFO: Request completed | | ... | +--------------------------------+
기본 사용법:
# access.log 파일에서 "404 Not Found" 문자열이 포함된 모든 줄 검색
$ grep "404 Not Found" access.log
주요 옵션과 활용:
-i(ignore case): 대소문자를 구분하지 않고 검색합니다. 'Error', 'error', 'ERROR'를 모두 찾고 싶을 때 유용합니다.$ grep -i "error" app.log-r또는-R(recursive): 현재 디렉터리와 모든 하위 디렉터리를 대상으로 재귀적으로 검색합니다. 프로젝트 전체에서 특정 변수나 함수 이름을 찾을 때 사용합니다.# 현재 디렉터리 아래 모든 .js 파일에서 'getUserById' 함수가 사용된 곳 찾기 $ grep -r "getUserById" . --include="*.js"-v(invert match): 패턴과 일치하지 않는 줄만 출력합니다. 주석 처리된 라인(#으로 시작)을 제외하고 설정 파일의 내용만 보고 싶을 때 유용합니다.$ grep -v "^#" /etc/nginx/nginx.conf-C [N](context): 일치하는 줄뿐만 아니라, 그 주변 N개의 줄(위 N줄, 아래 N줄)을 함께 출력합니다. 에러가 발생한 지점의 전후 맥락을 파악하는 데 매우 중요합니다.$ grep -C 3 "Exception" error.log
grep은 다른 명령어와 파이프(|)로 연결될 때 그 진가가 드러납니다. 예를 들어, 현재 실행 중인 프로세스 목록(ps aux)에서 'nginx'와 관련된 프로세스만 필터링하고 싶을 때 다음과 같이 사용합니다.
$ ps aux | grep "nginx"
이러한 명령어 조합은 리눅스 CLI의 핵심 철학을 보여주는 대표적인 예입니다.
find: 조건에 따라 파일 및 디렉터리 검색
grep이 파일 '내용'을 검색한다면, find는 파일 '자체'를 검색하는 도구입니다. 이름, 종류, 크기, 수정 시간, 권한 등 다양한 조건을 조합하여 파일 시스템 전체에서 원하는 파일을 찾아낼 수 있습니다.
기본 구조: find [검색 시작 경로] [조건식] [액션]
자주 사용되는 예시:
- 이름으로 찾기:
# 현재 디렉터리(.)와 그 하위에서 이름이 'main.py'인 파일 찾기 $ find . -name "main.py" # 이름이 '.log'로 끝나는 모든 파일 찾기 (와일드카드 사용 시 따옴표로 감싸기) $ find /var/log -name "*.log" - 종류로 찾기:
# '.git'이라는 이름의 디렉터리(type d) 찾기 $ find . -type d -name ".git" # 심볼릭 링크(type l) 파일만 찾기 $ find /usr/bin -type l - 수정 시간으로 찾기:
이 기능은 방금 수정한 설정 파일의 위치를 잊어버렸거나, 최근에 변경된 파일을 추적하여 배포 패키지를 만들 때 매우 유용합니다.# 최근 24시간 내에 수정된 파일(-mtime -1) 찾기 $ find . -mtime -1 # 최근 10분 내에 수정된 파일(-mmin -10) 찾기 $ find . -mmin -10 - 크기로 찾기:
디스크 공간이 부족할 때 용량이 큰 불필요한 파일을 찾는 데 사용됩니다.# 100MB보다 큰 파일 찾기 $ find / -size +100M
find의 가장 강력한 기능 중 하나는 -exec 액션입니다. 찾은 파일 각각에 대해 특정 명령어를 실행할 수 있게 해줍니다. 예를 들어, 프로젝트 내의 모든 .tmp 파일을 찾아 삭제하는 작업은 다음과 같이 수행할 수 있습니다.
# -exec 다음에 실행할 명령어를 쓰고, {}는 찾은 파일명을 의미하며, \;로 명령어의 끝을 알림
$ find . -name "*.tmp" -exec rm {} \;
이 방식은 find와 다른 도구를 결합하여 파일 시스템에 대한 배치(batch) 작업을 자동화하는 강력한 방법을 제공합니다.
3. 권한 관리와 사용자 제어
리눅스는 다중 사용자 시스템을 기반으로 하므로, 파일과 디렉터리에 대한 접근 권한을 명확히 설정하는 것이 매우 중요합니다. 특히 웹 서버 디렉터리, 실행 스크립트, 민감한 설정 파일 등의 권한을 잘못 설정하면 심각한 보안 문제로 이어질 수 있습니다.
chmod: 파일 권한 변경하기
chmod(change mode)는 파일이나 디렉터리의 접근 권한을 변경하는 명령어입니다. ls -l로 보이는 -rwxr-xr-x 같은 권한 문자열을 제어합니다.
+-----+-----+-----+
| r | w | x | <-- Permissions (Read, Write, Execute)
+-----+-----+-----+
| | |
4 2 1 <-- Octal Value
Example: rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
권한은 세 부분으로 나뉩니다: 소유자(user), 그룹(group), 그 외 사용자(others). 각 부분에 대해 읽기(read, r), 쓰기(write, w), 실행(execute, x) 권한을 부여할 수 있습니다.
권한을 설정하는 방법은 두 가지가 있습니다.
- 8진수 표기법 (Octal Notation): 가장 일반적인 방법입니다.
r= 4w= 2x= 1
rwx는 4+2+1=7,r-x는 4+0+1=5,rw-는 4+2+0=6이 됩니다. 이 숫자를 소유자, 그룹, 기타 사용자 순서로 나열합니다.
개발자가 직접 만든 쉘 스크립트는 실행 권한이 없어 실행되지 않는 경우가 많습니다. 이 때# my_script.sh 파일에 대해: # 소유자는 읽고, 쓰고, 실행할 수 있도록 (rwx -> 7) # 그룹은 읽고, 실행할 수 있도록 (r-x -> 5) # 그 외 사용자는 읽고, 실행할 수 있도록 (r-x -> 5) $ chmod 755 my_script.sh # config.ini 파일에 대해: # 소유자는 읽고 쓸 수 있도록 (rw- -> 6) # 그룹은 읽기만 가능하도록 (r-- -> 4) # 그 외 사용자는 아무 권한도 없도록 (--- -> 0) $ chmod 640 config.inichmod 755 [스크립트 파일]또는 간단히chmod +x [스크립트 파일]명령어로 실행 권한을 부여해야 합니다. - 기호 표기법 (Symbolic Notation): 더 직관적으로 권한을 추가하거나 제거할 수 있습니다.
u(user),g(group),o(others),a(all)+(권한 추가),-(권한 제거),=(권한 설정)
# my_script.sh 파일에 실행 권한(+)을 추가(a, 모든 사용자에게) $ chmod +x my_script.sh # 소유자(u)에게는 쓰기 권한(w)을 추가하고, 그룹(g)과 기타 사용자(o)에게는 쓰기 권한을 제거(-) $ chmod u+w,go-w data.csv
chown: 파일 소유자 변경하기
chown(change owner)은 파일이나 디렉터리의 소유자나 소유 그룹을 변경하는 명령어입니다. 주로 시스템 관리자(root) 권한으로 사용됩니다. 웹 서버를 운영할 때, 업로드된 파일의 소유자를 웹 서버 프로세스를 실행하는 사용자(예: www-data)로 변경해야 할 때 자주 사용됩니다.
# file.txt의 소유자를 'newuser'로 변경
$ sudo chown newuser file.txt
# file.txt의 소유자를 'newuser'로, 그룹을 'newgroup'으로 변경
$ sudo chown newuser:newgroup file.txt
# /var/www/html 디렉터리와 그 안의 모든 파일/디렉터리의 소유권을 재귀적으로 변경
$ sudo chown -R www-data:www-data /var/www/html
잘못된 소유권은 'Permission denied' 에러의 주된 원인이므로, 서버 환경에서 파일 접근에 문제가 생기면 ls -l로 권한과 소유권을 먼저 확인하는 것이 좋습니다.
sudo: 관리자 권한으로 명령어 실행
sudo(superuser do)는 현재 사용자가 잠시 관리자(root) 권한을 빌려 특정 명령어를 실행하게 해주는 도구입니다. 시스템 설정을 변경하거나, 패키지를 설치하거나, 시스템 디렉터리에 파일을 쓰는 등 관리자 권한이 필요한 작업을 할 때 명령어 앞에 붙여 사용합니다.
# 패키지 목록 업데이트 (관리자 권한 필요)
$ sudo apt-get update
# 시스템 설정 파일 수정 (관리자 권한 필요)
$ sudo nano /etc/nginx/nginx.conf
sudo는 시스템을 보호하는 중요한 장치입니다. 모든 작업을 root 사용자로 직접 수행하는 것은 매우 위험하므로, 평소에는 일반 사용자 계정을 사용하다가 필요할 때만 sudo를 통해 권한을 얻는 것이 보안상 안전한 방법입니다.
4. 시스템 정보 확인 및 프로세스 관리
서버에서 애플리케이션을 실행하고 디버깅하려면 현재 시스템의 상태를 파악하고 실행 중인 프로세스를 제어할 수 있어야 합니다. 시스템 자원 사용량을 확인하고, 응답 없는 프로세스를 종료하며, 네트워크 연결 상태를 점검하는 것은 개발 및 운영의 기본입니다.
ps: 현재 실행 중인 프로세스 확인
ps(process status)는 현재 시스템에서 실행 중인 프로세스의 스냅샷을 보여줍니다. 다양한 옵션 조합을 통해 원하는 정보를 필터링하고 정렬할 수 있습니다.
가장 널리 사용되는 옵션 조합은 aux입니다.
a: 터미널에 연결된 모든 사용자의 프로세스를 보여줍니다.u: 사용자 이름, CPU/메모리 사용량 등 상세 정보를 사용자 친화적인 형식으로 보여줍니다.x: 터미널에 연결되지 않은 프로세스(데몬 등)까지 모두 보여줍니다.
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169360 11424 ? Ss Oct25 0:02 /sbin/init
...
user 1234 0.5 2.5 123456 54321 ? Sl 10:30 0:15 /usr/bin/python3 app.py
...
이 출력에서 특정 프로세스를 찾고 싶을 때는 앞서 배운 grep과 조합합니다.
# 'python'이라는 이름이 포함된 프로세스 찾기
$ ps aux | grep 'python'
이 방법은 grep 프로세스 자체도 결과에 포함시키는 단점이 있습니다. 이를 피하기 위해 pgrep 명령어를 사용하거나, grep '[p]ython'과 같은 트릭을 사용하기도 합니다.
kill: 프로세스에 신호 보내기
kill은 이름과 달리 단순히 프로세스를 '죽이는' 명령어가 아니라, 프로세스에 특정 신호(signal)를 보내는 역할을 합니다. 가장 많이 사용되는 신호는 다음과 같습니다.
SIGTERM (15): 정상 종료 신호. 프로세스가 이 신호를 받으면, 하던 작업을 마무리하고(예: 열려있는 파일 닫기) 스스로 종료할 준비를 합니다.kill명령어의 기본값입니다.# PID가 1234인 프로세스에게 정상 종료 요청 $ kill 1234SIGKILL (9): 강제 종료 신호. 이 신호를 받은 프로세스는 어떠한 정리 작업도 할 수 없으며, 커널에 의해 즉시 강제로 종료됩니다. 애플리케이션이 응답하지 않을 때 최후의 수단으로 사용해야 합니다.# PID가 1234인 프로세스 강제 종료 $ kill -9 1234 # 또는 kill -SIGKILL 1234
프로세스를 종료하기 전에는 항상 SIGTERM으로 먼저 시도하고, 그래도 종료되지 않을 때 SIGKILL을 사용하는 것이 안전합니다.
pkill 명령어를 사용하면 프로세스 이름으로 바로 종료 신호를 보낼 수 있어 편리합니다.
# 이름에 'zombie_app'이 포함된 모든 프로세스 강제 종료
$ pkill -9 zombie_app
df, du: 디스크 사용량 확인
서버 운영 시 디스크 공간 부족은 심각한 장애로 이어질 수 있습니다. 정기적으로 디스크 사용량을 확인하는 것이 중요합니다.
df(disk free): 파일 시스템 전체의 디스크 공간 사용 현황을 보여줍니다.# -h (human-readable) 옵션과 함께 사용 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 20G 28G 42% / ...du(disk usage): 특정 파일이나 디렉터리가 차지하는 디스크 공간의 크기를 보여줍니다.# 현재 디렉터리의 전체 사용량 요약 (-s: summary) $ du -sh . 1.2G . # 현재 디렉터리의 각 하위 디렉터리별 사용량 확인 (-d 1: depth 1) $ du -h -d 1 450M ./logs 200M ./uploads ... 1.2G .du와sort,head명령어를 조합하면 특정 디렉터리에서 가장 많은 공간을 차지하는 하위 디렉터리나 파일을 쉽게 찾을 수 있습니다.
이 명령어 파이프라인은 리눅스 도구들이 어떻게 협력하여 복잡한 질문에 답하는지를 보여주는 훌륭한 예시입니다.# 현재 위치에서 가장 용량이 큰 10개의 디렉터리/파일 찾기 $ du -ah . | sort -rh | head -n 10
top, htop: 시스템 상태 실시간 모니터링
top은 시스템의 전반적인 상태와 실행 중인 프로세스 목록을 실시간으로 보여주는 터미널 기반의 작업 관리자입니다. CPU, 메모리 사용량, 실행 시간 등을 기준으로 정렬하여 어떤 프로세스가 시스템 자원을 많이 소모하는지 즉시 파악할 수 있습니다.
htop은 top의 개선된 버전으로, 컬러풀한 인터페이스, 마우스 지원, 더 쉬운 프로세스 검색 및 종료 기능을 제공하여 훨씬 사용자 친화적입니다. 대부분의 시스템에 기본 설치되어 있지 않으므로 sudo apt-get install htop 등으로 설치해야 합니다. CPU 코어별 사용량을 시각적으로 보여주고, 프로세스 트리를 쉽게 볼 수 있어 디버깅에 큰 도움이 됩니다.
5. 네트워크 관련 명령어
현대의 애플리케이션은 대부분 네트워크를 통해 통신합니다. 서버의 네트워크 연결 상태를 확인하고, 외부 서비스와의 통신을 테스트하며, 방화벽 문제를 진단하는 능력은 모든 개발자에게 필요합니다.
ping: 네트워크 연결 확인
ping은 특정 호스트(IP 주소 또는 도메인 이름)가 네트워크상에서 응답하는지 확인하는 가장 기본적인 도구입니다. ICMP 프로토콜을 사용하여 작은 데이터 패킷을 보내고 응답을 기다립니다.
$ ping google.com
PING google.com (142.250.204.14) 56(84) bytes of data.
64 bytes from lhr48s23-in-f14.1e100.net (142.250.204.14): icmp_seq=1 ttl=115 time=8.50 ms
...
"time=..." 부분은 응답 시간을 나타내며, 이 값이 안정적이고 낮을수록 네트워크 상태가 좋다는 의미입니다. 응답이 없으면 서버 자체의 문제이거나, 중간의 네트워크 장비(방화벽 등)가 ICMP 패킷을 차단하고 있을 가능성이 있습니다.
curl, wget: HTTP 요청 보내기
curl과 wget은 개발자가 API를 테스트하거나 웹에서 파일을 다운로드할 때 사용하는 필수 도구입니다.
curl(Client for URLs): 다양한 프로토콜(HTTP, HTTPS, FTP 등)을 지원하는 데이터 전송 도구입니다. 주로 API 테스트 및 개발에 막강한 기능을 발휘합니다.# 웹 페이지의 HTML 소스 가져오기 $ curl https://example.com # REST API GET 요청 보내기 $ curl -X GET https://api.example.com/users/1 # 헤더 정보와 함께 POST 요청 보내기 (JSON 데이터 전송) $ curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "value":123}' https://api.example.com/itemswget: 웹에서 파일을 다운로드하는 데 특화된 간단하고 강력한 도구입니다.# URL로부터 파일 다운로드 $ wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso # 다운로드를 이어받고(-c), 백그라운드에서 실행(-b) $ wget -c -b [Large_File_URL]
ssh: 원격 서버에 안전하게 접속하기
ssh(Secure Shell)는 암호화된 채널을 통해 원격 리눅스 서버에 접속하고 명령을 실행할 수 있게 해주는 프로토콜이자 프로그램입니다. 클라우드와 가상화가 보편화된 오늘날, 개발자에게 ssh는 로컬 컴퓨터의 터미널을 다루는 것만큼이나 익숙해야 할 도구입니다.
# 'user'라는 사용자로 'remote-server.com' 서버에 접속
$ ssh user@remote-server.com
# 특정 포트(예: 2222)로 접속
$ ssh -p 2222 user@remote-server.com
# 비밀번호 대신 SSH 키를 사용하여 접속 (더 안전하고 편리함)
$ ssh -i ~/.ssh/my_private_key user@remote-server.com
ssh는 단순히 원격 쉘을 제공하는 것 외에도, 원격 서버에서 단일 명령어를 실행하거나, 로컬과 원격 시스템 간에 파일을 안전하게 복사하는(scp, rsync) 기반 기술로도 사용됩니다.
# 원격 서버에서 'ls -l /var/www' 명령어만 실행하고 결과 받기
$ ssh user@remote-server.com "ls -l /var/www"
# 로컬의 local_file.txt를 원격 서버의 홈 디렉터리로 복사
$ scp local_file.txt user@remote-server.com:~/
마치며: 명령어는 언어다
지금까지 살펴본 명령어들은 리눅스라는 강력한 운영체제와 소통하기 위한 '언어'의 기본 단어와 같습니다. 각 단어(명령어)의 의미를 아는 것도 중요하지만, 더 중요한 것은 이 단어들을 조합하여 문장(파이프라인)을 만들고, 더 나아가 스크립트라는 '글'을 작성하여 복잡한 생각을 표현하고 작업을 자동화하는 능력입니다. find로 찾은 파일을 grep으로 필터링하고, 그 결과를 xargs로 받아 sed로 편집하는 일련의 과정은 마치 잘 짜인 문장처럼 유려하고 효율적입니다.
이 글에서 소개한 명령어와 옵션들은 빙산의 일각에 불과합니다. 각 명령어에는 훨씬 더 많고 강력한 기능들이 숨어있습니다. 터미널에서 man [명령어](예: man ls)를 입력하여 매뉴얼 페이지를 읽어보는 습관은 여러분을 더 높은 수준의 사용자로 이끌어 줄 것입니다. CLI 환경에 익숙해지는 데는 시간이 걸릴 수 있지만, 일단 그 힘을 체감하고 나면 이전의 작업 방식으로 돌아가기 어려울 것입니다. 꾸준히 사용하고, 실험하고, 자신만의 스크립트를 만들어보세요. 여러분의 손끝에서, 리눅스는 무한한 가능성을 가진 창의적인 도구가 될 것입니다.
Post a Comment