본문 바로가기

Theory/OS

생활코딩 강의를 통한 리눅스 기초 복습 요약

구름톤 딥다이브를 본격적으로 수강하기 전에 기존에 알고있던 리눅스 기초 지식을 복습할 수 있는 프리코스 강의가 있어 복습했다.

알고있던 명령어들이 대부분이여서 빠르게 수강할 수 있었다.

다만 해당 게시글은 노션에서 정리한 것을 단순히 옮긴 수준의 퀄리티 글이여서 읽기 좀 힘들 수 있다.

혹시나, 정리본이 필요한 사람이 만약에 있다면 댓글로 달아주시면 노션 게시글을 공유하도록 하겠다.

웹 서비스 등 리눅스 기초보다는 리눅스 운영에 가까운 서비스는 과감하게 생략했다.

이미 고등학교 시절 많이 구축해 보기도 했고, 구름톤 딥다이브를 위한 목적에서 벗어난 범위이기 때문이다.

 

ls

명령어의 역할

디렉토리 내 파일 및 폴더 목록을 표시한다.

명령어의 예시

  • ls → 현재 디렉토리의 파일 및 폴더 목록 출력
  • ls -l → 상세 정보(권한, 소유자, 크기, 수정 날짜 등)와 함께 목록 출력
  • ls -a → 숨김 파일(.으로 시작하는 파일) 포함하여 목록 출력
  • ls -lh → 파일 크기를 사람이 읽기 쉬운 형식(KB, MB, GB)으로 표시
  • ls -lt → 수정 시간 기준으로 정렬하여 출력
  • ls /etc → 특정 디렉토리(/etc)의 파일 목록 출력

pwd

명령어의 역할

현재 작업 중인 디렉토리의 절대 경로를 출력한다.

명령어의 예시

  • pwd → 현재 디렉토리의 전체 경로 출력
  • pwd -L → 심볼릭 링크를 유지한 상태로 경로 출력
  • pwd -P → 실제 물리적 경로(심볼릭 링크를 해석한 경로) 출력

cd

명령어의 역할

현재 작업 디렉토리를 변경한다.

명령어의 예시

  • cd /home/user → /home/user 디렉토리로 이동
  • cd .. → 상위 디렉토리로 이동
  • cd ~ → 사용자의 홈 디렉토리로 이동
  • cd - → 이전 작업 디렉토리로 이동
  • cd /etc && ls → /etc 디렉토리로 이동 후 파일 목록 출력

상대경로와 절대경로

  • 상대경로는 현재 디렉토리의 위치를 기준으로 다른 디렉토리의 위치를 표현하는 것으로 ..은 부모 디렉토리를 의미한다. 즉, 'cd ..'은 현재 디렉토리의 부모 디렉토리로 이동하는 명령이다. 참고로 현재 디렉토리는 '.' 이다.
  • 절대경로는 최상위 디렉토리를 기준으로 경로를 표현하는 것을 의미한다. 최상위 디렉토리는 루트(root) 디렉토리라고 하고 '/' 이다. 'cd /'는 최상위 디렉토리로 이동한다는 뜻이다. 'cd /home/egoing'은 현재 디렉토리가 무엇이건 언제나 '/home/egoing'을 의미하는데 이런 식의 경로 표현을 절대경로라고 한다.

rm

명령어의 역할

파일 또는 디렉토리를 삭제한다.

명령어의 예시

  • rm file.txt → file.txt 파일 삭제
  • rm -i file.txt → 삭제 전에 확인 메시지 출력
  • rm -f file.txt → 강제 삭제(확인 없이 삭제)
  • rm -r dir/ → dir/ 디렉토리와 내부 파일 삭제
  • rm -rf dir/ → dir/ 디렉토리를 강제 삭제(경고 없이 삭제)
  • rm *.log → 현재 디렉토리의 .log 확장자를 가진 모든 파일 삭제

-help

명령어의 역할

명령어의 사용법과 옵션을 확인하는 도움말을 출력한다.

명령어의 예시

  • ls --help → ls 명령어의 사용법과 옵션 목록 출력
  • grep --help → grep 명령어의 도움말 출력
  • tar --help → tar 명령어의 사용법 및 옵션 확인
  • chmod --help → chmod 명령어의 상세 옵션 확인

참고

  • 대부분의 리눅스 명령어는 -help 옵션을 제공하며, 이를 통해 사용법을 간단히 확인할 수 있다.
  • 보다 자세한 설명이 필요하면 man <명령어> 또는 info <명령어>를 사용할 수도 있다.

man

명령어의 역할

명령어의 매뉴얼 페이지를 출력하여 사용법과 상세 정보를 확인한다.

명령어의 예시

  • man ls → ls 명령어의 매뉴얼 페이지 출력
  • man grep → grep 명령어의 사용법 및 옵션 확인
  • man -k network → "network"와 관련된 명령어 목록 검색
  • man 5 passwd → passwd 파일 형식(섹션 5) 문서 확인
  • man -f ls → ls 명령어가 포함된 매뉴얼 섹션 확인

참고

  • 매뉴얼 페이지는 여러 섹션(1~9)으로 구성되며, 같은 이름의 명령어가 다른 섹션에 있을 수도 있다.
  • q 키를 눌러 매뉴얼 페이지를 종료할 수 있다.

sudo

명령어의 역할

일반 사용자 계정에서 관리자(root) 권한으로 명령어를 실행한다.

명령어의 예시

  • sudo apt update → 패키지 목록을 업데이트 (Debian 계열)
  • sudo yum install httpd → Apache 웹 서버 설치 (RHEL 계열)
  • sudo systemctl restart nginx → Nginx 서비스 재시작
  • sudo vi /etc/hosts → 시스템 파일 /etc/hosts를 root 권한으로 편집
  • sudo su → root 계정으로 전환
  • sudo -u postgres psql → 특정 사용자(postgres) 권한으로 psql 실행

참고

  • sudo를 실행하려면 사용자가 sudo 그룹에 속해 있어야 한다.
  • visudo 명령어를 사용하여 /etc/sudoers 파일을 수정하면 특정 사용자나 그룹에 대한 권한을 제어할 수 있다.
  • sudo !! → 직전 명령어를 관리자 권한으로 실행한다.

nano

명령어의 역할

터미널에서 간단하게 텍스트 파일을 편집할 수 있는 CLI 기반 텍스트 편집기이다.

명령어의 예시

  • nano file.txt → file.txt 파일을 열어 편집
  • nano /etc/hosts → 시스템 설정 파일 /etc/hosts를 편집
  • nano -c file.txt → 파일을 열 때 줄 번호 표시
  • nano -m file.txt → 마우스 지원 활성화
  • nano -B file.txt → 편집 전 백업 파일(file.txt~) 자동 생성

참고

  • ^0 에서 ^는 Ctrl 키를 의미한다.
  • 단축키 목록
  • nano는 vi나 vim보다 직관적이고 간단하여 빠르게 파일을 편집할 때 유용하다.

리눅스의 패키지 관리자(Package Manager)

패키지 관리자(Package Manager)는 리눅스 시스템에서 소프트웨어 패키지를 설치, 업데이트, 제거 및 관리하는 도구이다. 각 배포판은 자체적인 패키지 관리 시스템을 사용한다.

  • 저장소(Repository): 패키지 관리자가 소프트웨어를 다운로드하는 원격/로컬 저장소
  • 의존성 해결: 일부 패키지는 다른 패키지에 의존하며, APT, YUM, DNF 등은 이를 자동 해결
  • 캐시 관리: 패키지 정보 및 다운로드한 패키지 파일을 캐싱하여 재사용 가능

Debian 계열 (Ubuntu, Debian 등)

  • APT (Advanced Package Tool)
  • DPKG (Debian Package Manager)

wget

명령어의 역할

웹에서 파일을 다운로드하는 명령어로, HTTP, HTTPS, FTP 프로토콜을 지원한다.

명령어의 예시

참고

  • 기본적으로 다운로드한 파일은 현재 작업 디렉토리에 저장된다.
  • wget은 GUI 없이 동작하기 때문에 서버 환경에서 파일을 가져올 때 유용하다.
  • SSL 인증서가 필요한 경우 wget --ca-certificate=file.pem 옵션을 사용할 수 있다.

git

명령어의 역할

분산 버전 관리 시스템(Git)을 사용하여 소스 코드의 변경 사항을 추적하고 관리한다.

명령어의 예시

  • git init → 현재 디렉토리를 Git 저장소로 초기화
  • git clone https://github.com/user/repo.git → 원격 저장소를 로컬로 복제
  • git status → 현재 저장소의 상태 확인
  • git add file.txt → file.txt 변경 사항을 스테이징 영역에 추가
  • git commit -m "커밋 메시지" → 스테이징된 변경 사항을 커밋
  • git push origin main → 로컬 변경 사항을 원격 저장소의 main 브랜치로 푸시
  • git pull origin main → 원격 저장소의 최신 변경 사항을 로컬로 가져오기
  • git branch feature → 새로운 브랜치 feature 생성
  • git checkout feature → feature 브랜치로 전환
  • git merge feature → 현재 브랜치에 feature 브랜치의 변경 사항 병합
  • git log --oneline → 간단한 형식으로 커밋 로그 확인
  • git reset --hard HEAD~1 → 마지막 커밋을 되돌리고 변경 사항 삭제

참고

  • git config --global user.name "Your Name" → 전역 사용자 이름 설정
  • git config --global user.email "you@example.com" → 전역 사용자 이메일 설정
  • .gitignore 파일을 사용하여 Git에서 추적하지 않을 파일을 지정할 수 있다.

CLI(Command-Line Interface)를 배워야 하는 이유

CLI(Command-Line Interface)는 GUI(Graphical User Interface)보다 학습 곡선이 가파를 수 있지만, 효율성과 자동화 측면에서 뛰어난 장점을 제공한다.

기준
CLI
GUI
사용 속도
명령어 입력 후 즉시 실행 가능
마우스로 클릭해야 하므로 상대적으로 느림
자동화
스크립트 작성으로 반복 작업 자동화 가능
수작업이 필요하여 자동화 어려움
시스템 자원 사용
매우 적음 (텍스트 기반)
비교적 많음 (그래픽 요소 사용)
유연성
다양한 파라미터와 옵션 조합 가능
제한적인 기능 제공
원격 관리
SSH 등으로 원격 서버 관리 가능
GUI 원격 접속이 불편하고 무겁다
학습 난이도
명령어를 익혀야 하지만 강력한 제어 가능
직관적이지만 기능이 제한적
재현성
같은 명령어 실행 시 동일한 결과 보장
GUI의 경우 설정이 다를 수 있음

CLI를 사용하는 이유 - 연속 실행(세미콜론 ;)

CLI에서는 여러 명령어를 한 줄에서 연속 실행(Sequence Execution)할 수 있다. 이를 위해 세미콜론(;)을 사용하면 된다.

  • 여러 개의 명령어를 한 번에 실행 가능
  • 입력 시간을 줄여서 생산성 향상
  • 스크립트 없이 간단한 자동화 가능

명령어1 ; 명령어2 ; 명령어3

  • 명령어1이 실행된 후 명령어2, 명령어3이 차례대로 실행됨.
  • 앞의 명령어가 성공하든 실패하든 상관없이 다음 명령어가 실행됨.

명령어1 && 명령어2 && 명령어3

  • 명령어1이 실행된 후 명령어2, 명령어3이 차례대로 실행됨.
  • 앞의 명령어가 성공하든 실패하든 상관없이 다음 명령어가 실행됨.

CLI를 사용하는 이유 - 파이프라인(|)

CLI에서는 파이프라인(|)을 사용하여 여러 명령어를 연결하고 데이터를 효율적으로 처리할 수 있다.

  • 출력(Output)을 다음 명령어의 입력(Input)으로 전달 가능
  • 데이터를 실시간으로 필터링 및 가공 가능
  • GUI에서는 불가능한 복잡한 데이터 처리 자동화 가능

명령어1 | 명령어2 | 명령어3

  • 명령어1의 출력이 명령어2의 입력으로 전달됨.
  • 명령어2의 출력이 명령어3의 입력으로 전달됨.
  • 연속적으로 데이터를 가공하면서 원하는 결과를 얻을 수 있음.
  • 파이프라인 (|) 예제
  • 파이프라인 > 를 사용해 Output 으로 사용할 수 있다.

grep

명령어의 역할

파일 또는 입력된 텍스트에서 특정 문자열을 검색하는 명령어이다.

명령어의 예시

  • grep "error" logfile.txt → logfile.txt에서 "error"가 포함된 줄 출력
  • grep -i "error" logfile.txt → 대소문자 구분 없이 "error" 검색
  • grep -r "TODO" /home/user/projects → /home/user/projects 디렉토리 내 모든 파일에서 "TODO" 검색
  • grep -v "DEBUG" logfile.txt → logfile.txt에서 "DEBUG"가 포함되지 않은 줄 출력
  • grep -c "error" logfile.txt → logfile.txt에서 "error"가 포함된 줄 개수 출력
  • grep -n "error" logfile.txt → logfile.txt에서 "error"가 포함된 줄과 해당 줄 번호 출력
  • ps aux | grep nginx → 실행 중인 프로세스 목록에서 "nginx" 포함된 행 검색
  • ls -l | grep "^d" → 디렉토리만 필터링하여 출력

참고

  • grep은 정규 표현식을 지원하며, grep -E 또는 egrep을 사용하면 확장 정규 표현식을 활용할 수 있다.
  • 특정 단어만 검색하려면 grep -w "word"를 사용한다.
  • grep -A 3 "error" logfile.txt → "error"가 포함된 줄과 그 아래 3줄 출력
  • grep -B 3 "error" logfile.txt → "error"가 포함된 줄과 그 위 3줄 출력
  • grep -C 3 "error" logfile.txt → "error"가 포함된 줄과 위아래 3줄 출력

Linux - 입출력 리디렉션(IO Redirection) 1: 출력(Output)

  • 출력 리디렉션(Output Redirection)은 명령어 실행 결과(표준 출력, 에러 출력)를 파일로 저장하거나 다른 출력 방식으로 변경하는 기능이다.
  1. 출력 리디렉션 종류
  1. 표준 출력 리디렉션 (> & >>)
  1. 표준 오류 리디렉션 (2>, 2>>)
  1. 표준 출력 + 표준 오류 리디렉션 (&>, &>>)
  2. /dev/null을 활용한 출력 무시

Linux - 입출력 리디렉션(IO Redirection) 2: 입력(Input Redirection)

입력 리디렉션(Input Redirection)은 명령어 실행 시 키보드 입력 대신 파일 또는 다른 입력 소스를 사용할 수 있도록 하는 기능이다.

1. 입력 리디렉션(Input Redirection) 종류

연산자
설명
<
파일을 표준 입력으로 사용
<<
여러 줄 입력(히어 도큐먼트, Here Document) 사용
<<<
문자열을 표준 입력으로 전달 (히어 스트링, Here String)

2. 파일 입력 리디렉션(File Input Redirection) (<)

1) 파일을 입력으로 사용

sort < input.txt

  • input.txt 파일의 내용을 표준 입력으로 받아 정렬(sort) 수행
  1. 히어 도큐먼트(Here Document) (<<)

4. 히어 스트링(Here String) (<<<)

1) 문자열을 입력으로 전달

grep "hello" <<< "hello world"

  • "hello world" 문자열을 grep의 입력으로 전달하여 "hello" 검색

2) 변수를 입력으로 전달

name="Linux"

  • echo "안녕하세요, $name" <<< "Linux"
  • 변수 값을 입력으로 사용

head

명령어의 역할

파일의 처음 몇 줄을 출력하는 명령어이다. 기본적으로 처음 10줄을 표시한다.

명령어의 예시

  • head file.txt → file.txt의 처음 10줄 출력
  • head -n 5 file.txt → file.txt의 처음 5줄 출력
  • head -n 20 file.txt → file.txt의 처음 20줄 출력
  • head -c 100 file.txt → file.txt의 처음 100바이트 출력
  • head -v file.txt → 파일 이름과 함께 내용 출력
  • head -q file1.txt file2.txt → 여러 파일을 출력할 때 파일 이름 없이 출력

참고

  • head는 tail 명령어와 반대로 동작하며, tail은 파일의 마지막 몇 줄을 출력하는 데 사용된다.
  • 여러 개의 파일을 입력하면 각각의 파일에 대해 결과를 출력한다.
  • 파이프(|)와 함께 사용하면 긴 출력에서 상위 일부만 확인할 수 있다.

tail

명령어의 역할

파일의 마지막 몇 줄을 출력하는 명령어이다. 기본적으로 마지막 10줄을 표시한다.

명령어의 예시

  • tail file.txt → file.txt의 마지막 10줄 출력
  • tail -n 5 file.txt → file.txt의 마지막 5줄 출력
  • tail -n 20 file.txt → file.txt의 마지막 20줄 출력
  • tail -c 100 file.txt → file.txt의 마지막 100바이트 출력
  • tail -f /var/log/syslog → syslog 파일의 실시간 변경 내용을 계속 출력
  • tail -F /var/log/syslog → 파일이 이동되거나 삭제되어도 계속 감시 (f보다 안정적)
  • tail -q file1.txt file2.txt → 여러 파일을 출력할 때 파일 이름 없이 출력

참고

  • tail -f는 로그 파일 감시에 유용하며, 실시간으로 변경되는 내용을 볼 수 있다.
  • tail은 head 명령어와 반대로 동작하며, 파일의 마지막 부분을 확인하는 데 사용된다.
  • 파이프(|)와 함께 사용하면 긴 출력에서 하위 일부만 확인할 수 있다.

Linux - 쉘(Shell)과 커널(Kernel)

쉘(Shell)과 커널(Kernel)은 리눅스 운영체제의 핵심 구성 요소로, 시스템 자원 관리와 사용자 인터페이스 역할을 수행한다.

  1. 커널(Kernel)
  1. 쉘(Shell)
  1. 요약

Linux - 디렉터리 구조(Directory Structure)

리눅스 디렉터리 구조(Directory Structure)는 FHS(Filesystem Hierarchy Standard)에 따라 계층적으로 구성되어 있으며, 각 디렉터리는 특정한 역할을 수행한다.

1. 리눅스 디렉터리 구조 개요

디렉터리
설명
/
루트 디렉터리, 모든 파일 및 디렉터리의 최상위 경로
/bin
필수 명령어(ls, cat, cp 등)가 포함된 바이너리 디렉터리
/boot
부팅 관련 파일(vmlinuz, initrd.img, grub 등) 저장
/dev
하드웨어 장치 파일(sda, tty, null 등)이 포함
/etc
시스템 설정 파일(passwd, hosts, fstab 등) 저장
/home
사용자 홈 디렉터리(/home/user)
/lib
기본 라이브러리(libc.so, ld-linux.so 등) 저장
/media
이동식 미디어(USB, CD-ROM) 마운트 지점
/mnt
임시 마운트 지점
/opt
추가 애플리케이션 패키지 설치 경로
/proc
시스템 및 프로세스 정보(/proc/cpuinfo, /proc/meminfo 등) 제공
/root
루트 사용자의 홈 디렉터리
/run
시스템 초기화 및 프로세스 관련 파일 저장
/sbin
시스템 관리자용 바이너리 명령어(fsck, ifconfig 등) 저장
/srv
서비스 데이터(HTTP, FTP 등) 저장
/sys
시스템 및 하드웨어 정보 제공
/tmp
임시 파일 저장, 시스템 재부팅 시 삭제됨
/usr
공유 응용 프로그램 및 라이브러리 저장
/var
가변 데이터(로그, 캐시, 메일, 스풀 등) 저장

whereis

명령어의 역할

명령어의 실행 파일, 소스 코드, 매뉴얼 페이지가 저장된 위치를 찾는다.

명령어의 예시

  • whereis ls → ls 명령어의 바이너리, 소스, 매뉴얼 페이지 위치 출력
  • whereis -b ls → ls 명령어의 실행 파일 위치만 출력
  • whereis -m ls → ls 명령어의 매뉴얼 페이지 위치만 출력
  • whereis -s ls → ls 명령어의 소스 코드 위치만 출력
  • whereis -l → whereis가 검색하는 디렉토리 목록 출력

참고

  • whereis는 실행 파일(b), 매뉴얼 파일(m), 소스 코드(s)를 찾을 수 있다.
  • 단순히 명령어의 경로를 찾고 싶다면 which 명령어를 사용할 수도 있다.
  • whereis는 일반적으로 시스템 디렉토리(/bin, /sbin, /usr/bin 등)에서만 검색하며, 사용자 디렉토리는 포함되지 않는다.

Linux - $PATH 환경 변수

$PATH는 시스템에서 실행 가능한 명령어가 저장된 디렉터리 목록을 지정하는 환경 변수이다.

  • 사용자가 명령어를 입력하면, 쉘(Shell)은 $PATH에 정의된 디렉터리에서 해당 명령어를 찾는다.
  • $PATH에 등록되지 않은 디렉터리의 실행 파일은 절대 경로 또는 상대 경로를 입력해야 실행 가능하다.
  • echo $PATH 명령어를 통해 설정되어 있는 실행 가능한 명령어와 관련된 디렉터리를 확인할 수 있다.

Linux - 프로세스(Process) 1: 컴퓨터 구조(Computer Structure)

프로세스(Process)는 프로그램이 실행될 때 CPU, RAM, Storage 간의 데이터 흐름을 거쳐 동작한다.

  1. 프로그램 로드 (Storage → RAM)
  2. 명령어 실행 (RAM → CPU)
  3. 입출력 및 저장 (CPU → RAM → Storage)
  4. 프로세스 종료

Linux - 프로세스(Process) 2: ps, top, htop

ps, top, htop은 리눅스에서 프로세스를 모니터링하고 관리하는 도구이다.

ps는 현재 실행 중인 프로세스를 스냅샷(snapshot) 방식으로 출력하고, top과 htop은 실시간으로 프로세스를 모니터링하는 도구이다.

  1. ps (Process Status) - 현재 실행 중인 프로세스 조회
  1. top - 실시간 프로세스 모니터링
  1. htop - 직관적인 프로세스 모니터링 (top의 확장형)

Linux - top에서의 로드 애버리지(Load Average)

로드 애버리지(Load Average)는 시스템의 CPU 부하 상태를 나타내는 지표로, 일정 시간 동안 실행 중이거나 실행 대기 중인 프로세스의 평균 개수를 의미한다.

  • top 명령어 실행 시, 상단에 표시되는 load average: 0.50, 1.20, 2.10이 이에 해당한다. 이 수치는 하나의 코어를 기준으로 대기하고 있는 프로세스를 의미한다.
  • 로드 애버리지 해석 방법
  • CPU 코어 수에 따른 해석
  • 나의 경우는 12코어 맥북을 사용하고 있으므로 Load average 2.64 3.13 3.01 기준으로 CPU 사용률이 약 25% 수준인 것이다.

locate

명령어의 역할

파일 시스템에서 특정 파일이나 디렉토리의 경로를 빠르게 검색한다.

명령어의 예시

  • locate file.txt → file.txt 파일이 존재하는 모든 경로 출력
  • locate -i readme → 대소문자 구분 없이 readme 파일 검색
  • locate /bin/bash → /bin/bash 파일의 전체 경로 출력
  • locate -c config → config가 포함된 파일 개수 출력
  • locate -l 5 error.log → error.log 파일 검색 결과 중 5개만 출력
  • locate "*.conf" → .conf 확장자를 가진 모든 파일 검색

참고

  • locate는 기존에 생성된 데이터베이스(/var/lib/mlocate.db)를 기반으로 검색하기 때문에 매우 빠르다.
  • 새롭게 생성된 파일을 반영하려면 데이터베이스를 업데이트해야 한다.
  • find 명령어는 실시간 검색을 수행하지만, locate는 데이터베이스를 기반으로 빠르게 검색하는 방식이므로 최신 파일이 검색되지 않을 수 있다.

find

명령어의 역할

파일 시스템에서 특정 조건에 맞는 파일이나 디렉토리를 검색한다.

명령어의 예시

  • find / -name file.txt → 루트 디렉토리(/)에서 file.txt 파일 검색
  • find /home -name "*.log" → /home 디렉토리에서 .log 확장자를 가진 파일 검색
  • find /var/log -type f -name "*.log" → /var/log 디렉토리에서 .log 파일만 검색
  • find /etc -type d -name "conf.d" → /etc 디렉토리에서 conf.d 폴더 검색
  • find . -size +100M → 현재 디렉토리에서 100MB보다 큰 파일 검색
  • find /tmp -user user1 → /tmp 디렉토리에서 user1이 소유한 파일 검색
  • find /home -mtime -3 → 최근 3일 이내 수정된 파일 검색
  • find /var -name "*.log" -exec rm -f {} \; → /var 디렉토리에서 .log 파일을 찾아 삭제

참고

  • find는 실시간으로 검색하므로 locate보다 느리지만, 최신 상태의 파일을 검색할 수 있다.
  • type 옵션
  • size 옵션
  • mtime 옵션
  • exec 옵션을 사용하면 검색된 파일에 대해 특정 명령어 실행 가능

Linux - 백그라운드 실행(Background Execution) (Ctrl+Z, &)

리눅스에서 프로세스를 백그라운드로 실행하면, 터미널을 차단하지 않고 다른 작업을 수행할 수 있다.

  • &를 사용하여 명령을 백그라운드에서 실행하거나, Ctrl+Z로 실행 중인 프로세스를 일시 정지한 후 백그라운드로 전환할 수 있다.
  • jobs를 사용하여 현재 백그라운드에서 실행되고 있는 프로세스에 대한 PID 값과 Job ID 값을 얻을 수 있다.
  • kill를 사용하여 해당 백그라운드에서 실행되는 프로세스를 terminated 시킬 수 있다.
  • fg %$JOB_ID 를 사용하여 백그라운드에서 실행되는 프로세스를 다시 포그라운드로 가져올 수 있다.

Linux - 데몬(Daemon)

데몬(Daemon)은 백그라운드에서 실행되며, 지속적으로 시스템 서비스를 제공하는 프로세스이다.

  • 일반적으로 사용자가 직접 실행하지 않으며, 부팅 시 자동 실행되고, 시스템이 종료될 때까지 동작한다.
  1. 데몬(Daemon)의 특징
  1. 데몬 프로세스 확인 방법

Linux - 시간 기반 작업 스케줄링(Time-based Job Scheduling) - cron 사용법(Usage)

cron은 리눅스에서 특정 시간에 자동으로 명령어 또는 스크립트를 실행하는 데 사용되는 스케줄링 시스템이다.

  • 반복적인 작업(백업, 로그 정리, 시스템 유지보수 등)을 자동화하는 데 유용하다.
  • 스케줄링 정보는 crontab(크론 테이블) 파일에 저장되며, 사용자별로 관리 가능하다.

1. croncrontab 개요

개념
설명
cron
일정한 시간 간격으로 작업을 실행하는 데몬 프로세스
crontab
cron 스케줄을 관리하는 설정 파일
/etc/crontab
시스템 전체의 cron 작업을 설정하는 글로벌 설정 파일
/var/spool/cron/
각 사용자별 crontab 스케줄 저장 디렉터리

2. crontab 명령어 사용법

명령어
설명
crontab -l
현재 사용자 cron 작업 목록 확인
crontab -e
cron 작업 추가 또는 수정
crontab -r
현재 사용자의 cron 작업 전체 삭제
crontab -u user -l
특정 사용자의 cron 작업 확인 (root 권한 필요)

3. crontab 일정 표현 형식

  • crontab 파일의 각 줄은 특정 시간에 실행될 작업을 정의한다.
  • 기본 형식: 분 시간 일 월 요일 실행할_명령어
  1. crontab 사용 예제
  1. cron 로그 확인 (/var/log/cron)

alias

명령어의 역할

명령어를 단축해서 사용할 수 있도록 별칭을 설정하는 명령어이다.

명령어의 예시

  • alias ll='ls -l' → ll을 ls -l로 단축하여 사용
  • alias rm='rm -i' → rm을 rm -i로 설정하여 삭제 시 확인 메시지 표시
  • alias gs='git status' → gs를 입력하면 git status 실행
  • alias dfh='df -h' → dfh를 입력하면 df -h 실행
  • alias update='sudo apt update && sudo apt upgrade -y' → 시스템 업데이트 명령어 단축

참고

  • 현재 설정된 별칭을 확인하려면 alias 명령어를 실행
  • 별칭을 해제하려면 unalias ll 또는 unalias -a (모든 별칭 해제)
  • 별칭을 영구적으로 사용하려면 ~/.bashrc 또는 ~/.zshrc 파일에 추가한 후 source ~/.bashrc 실행

Linux - 시작 스크립트(Startup Script) - bashrc

~/.bashrc는 사용자의 Bash 셸이 실행될 때 자동으로 실행되는 스크립트 파일이다.

  • 주로 환경 변수 설정, 명령어 별칭(alias), 프롬프트 설정, 사용자 정의 함수 등을 포함한다.
  • 아래는 시작 스크립트의 종류이다.

Linux - 다중 사용자(Multi-User)

리눅스는 기본적으로 다중 사용자(Multi-User) 환경을 지원하는 운영체제이며, 여러 사용자가 동시에 시스템을 사용할 수 있다.

  • 각 사용자는 고유한 계정, 파일, 프로세스, 권한을 가지며, 시스템 리소스에 대한 접근이 제어된다.

id

명령어의 역할

현재 사용자 또는 지정된 사용자의 UID(사용자 ID), GID(그룹 ID), 소속 그룹 정보를 출력한다.

명령어의 예시

  • id → 현재 사용자의 UID, GID, 소속 그룹 정보 출력
  • id user1 → user1 사용자의 UID, GID, 소속 그룹 정보 출력
  • id -u → 현재 사용자의 UID만 출력
  • id -g → 현재 사용자의 기본 그룹(GID)만 출력
  • id -G → 현재 사용자가 속한 모든 그룹의 GID 출력
  • id -nG → 현재 사용자가 속한 그룹의 이름 출력
  • id -u user1 → user1 사용자의 UID 출력
  • id -g user1 → user1 사용자의 기본 그룹 ID 출력

참고

  • UID 0은 root 사용자를 의미한다.
  • 그룹 정보는 /etc/group 파일에서 확인할 수 있다.
  • whoami는 현재 사용자 이름만 출력하는 반면, id는 UID, GID 및 그룹 정보를 포함하여 상세 정보를 제공한다.

who

명령어의 역할

현재 시스템에 로그인한 사용자 목록과 로그인 정보를 출력한다.

명령어의 예시

  • who → 현재 로그인한 모든 사용자 출력
  • who -H → 컬럼 헤더(제목) 포함하여 출력
  • who -q → 로그인한 사용자 계정만 출력 및 사용자 수 표시
  • who -b → 시스템 부팅 시간 출력
  • who -m → 현재 터미널에서 실행한 사용자 정보만 출력
  • who -u → 사용자의 로그인 시간과 프로세스 ID 포함하여 출력

참고

  • who는 현재 로그인한 사용자 목록을 표시하며, w 명령어는 로그인한 사용자의 세부적인 활동 정보(CPU 사용량, 실행 중인 프로세스 등)를 포함하여 출력한다.
  • whoami는 현재 명령을 실행한 사용자 이름만 출력한다.

Linux - 루트 사용자(Root User)

루트 사용자(Root User)는 리눅스에서 최고 권한을 가진 관리자 계정으로, 시스템의 모든 파일 및 설정을 변경할 수 있다.

  • 일반적으로 UID(User ID)가 0인 계정이며, 모든 명령 실행, 사용자 관리, 시스템 설정 변경 등의 권한을 가진다.
  • 루트 사용자(root)의 특징
  • 루트 사용자로 전환하는 방법
  • 루트 계정 보안 관리

passwd

명령어의 역할

사용자 계정의 비밀번호를 변경하거나 정보를 수정하는 명령어이다.

명령어의 예시

  • passwd → 현재 사용자의 비밀번호 변경
  • passwd user1 → user1 사용자의 비밀번호 변경 (root 권한 필요)
  • passwd -e user1 → user1 사용자의 비밀번호 만료 설정 (다음 로그인 시 변경 요구)
  • passwd -l user1 → user1 계정 잠금
  • passwd -u user1 → user1 계정 잠금 해제
  • passwd -S user1 → user1 계정의 비밀번호 상태 확인
  • passwd -x 30 user1 → user1 사용자의 비밀번호 최대 사용 기간을 30일로 설정

참고

  • 비밀번호 정책(최소 길이, 복잡성 등)은 /etc/login.defs 또는 pam_pwquality 모듈을 통해 관리된다.
  • 루트 사용자는 다른 사용자의 비밀번호를 변경할 수 있다.
  • 계정 잠금(l)과 해제(u)는 사용자 로그인 보안 정책에 활용된다.

adduser / useradd

명령어의 역할

새로운 사용자를 생성하는 명령어이다.

명령어의 예시

  1. adduser (권장)
  2. useradd (저수준 명령어)

참고

  • adduser는 더 직관적이고 자동 설정 포함 (useradd보다 권장됨)
  • useradd는 더 낮은 수준의 명령어이며, 홈 디렉토리 생성(m) 등 추가 옵션이 필요함
  • 사용자의 정보를 확인하려면 id user1 또는 getent passwd user1 명령어 사용

usermod

명령어의 역할

기존 사용자의 정보를 수정하는 명령어이다.

명령어의 예시

  • sudo usermod -l newuser olduser → olduser의 사용자 이름을 newuser로 변경
  • sudo usermod -d /home/newhome -m user1 → user1의 홈 디렉토리를 /home/newhome으로 이동
  • sudo usermod -s /bin/zsh user1 → user1의 기본 로그인 쉘을 /bin/zsh로 변경
  • sudo usermod -G sudo user1 → user1을 sudo 그룹에 추가
  • sudo usermod -aG docker user1 → user1을 docker 그룹에 추가 (기존 그룹 유지)
  • sudo usermod -L user1 → user1 계정 잠금
  • sudo usermod -U user1 → user1 계정 잠금 해제

참고

  • G 옵션은 기존 그룹을 덮어쓰므로, 기존 그룹을 유지하면서 추가하려면 aG 옵션을 사용해야 한다.
  • 계정 잠금(L)과 해제(U)는 로그인 보안 정책 관리에 사용된다.
  • 사용자의 현재 정보를 확인하려면 id user1 또는 getent passwd user1을 사용하면 된다.

Linux - 권한(Permission) : 기본 개념(Basic)

리눅스에서는 파일과 디렉터리에 대한 접근 권한을 제어하여 보안을 유지한다.

  • 모든 파일과 디렉터리는 소유자(Owner), 그룹(Group), 기타 사용자(Others)에 대해 각각의 권한을 가진다.
  • 리눅스 파일 권한 개요
  • 권한은 rwx(읽기, 쓰기, 실행) 형식으로 표현되며, 각 파일은 3개의 사용자 그룹에 대해 개별적인 권한을 가진다.

chmod

명령어의 역할

파일 및 디렉토리의 권한(퍼미션)을 변경하는 명령어이다.

명령어의 예시

  1. 숫자 모드(8진수) 변경
  2. 기호 모드(문자) 변경
  3. 디렉토리 권한 설정

참고

  • chmod는 파일 권한을 직접 변경하며, 소유자를 변경하려면 chown을 사용한다.
  • 8진수 권한 의미:
  • ls -l을 사용하여 현재 파일 권한을 확인할 수 있다.

Linux - 권한(Permission) : 파일과 디렉터리

리눅스에서 실행 권한(Execute Permission, x)은 파일 및 디렉터리에 대해 다른 의미를 가진다.

  1. 파일 권한(File Permission)의 의미
  2. 디렉터리 권한(Directory Permission)의 의미

Linux - 그룹(Group)

리눅스에서 그룹(Group)은 사용자를 묶어서 파일 및 디렉터리의 접근 권한을 효과적으로 관리하는 개념이다.

  • 여러 사용자가 동일한 그룹에 속하면, 해당 그룹에 부여된 권한을 공유할 수 있다.
  • 그룹을 활용하면 다중 사용자 환경에서 파일 및 시스템 자원을 보다 효율적으로 관리할 수 있다.
  • 그룹(Group)의 특징

groupadd

명령어의 역할

새로운 사용자 그룹을 생성하는 명령어이다.

명령어의 예시

  • sudo groupadd devs → devs 그룹 생성
  • sudo groupadd -g 1050 admins → GID(그룹 ID) 1050을 가진 admins 그룹 생성
  • sudo groupadd -r system_group → 시스템 그룹 생성 (r 옵션 사용)

참고

  • 기본적으로 새 그룹의 GID는 /etc/group 파일에서 자동으로 할당된다.
  • 특정 사용자를 그룹에 추가하려면 usermod -aG groupname username 명령어를 사용해야 한다.
  • 그룹 정보를 확인하려면 getent group groupname 또는 cat /etc/group을 사용하면 된다.

chown

명령어의 역할

파일 및 디렉토리의 소유자(user)와 그룹(group)을 변경하는 명령어이다.

명령어의 예시

  1. 파일 소유자 변경
  2. 그룹 변경
  3. 현재 소유권 유지하면서 그룹만 변경

참고

  • 현재 파일의 소유자를 확인하려면 ls -l file.txt 사용
  • R 옵션을 사용하면 디렉토리 내 모든 파일과 하위 디렉토리에 적용
  • 시스템의 모든 파일 소유권을 변경할 때는 주의해야 한다. (-preserve-root 옵션을 활용)
  • 특정 사용자만 파일을 관리하도록 설정할 때 유용하다.

curl

명령어의 역할

HTTP, HTTPS, FTP 등 다양한 프로토콜을 사용하여 웹 요청을 전송하고 데이터를 다운로드하는 명령어이다.

명령어의 예시

  1. 기본적인 HTTP 요청
  2. HTTP 요청 옵션 사용
  3. 데이터 전송
  4. 인증 및 보안

참고

  • curl은 REST API 테스트, 파일 다운로드, HTTP 요청 디버깅 등에 자주 사용된다.
  • JSON 데이터를 다룰 때 jq와 함께 사용하면 가독성이 향상된다.
  • wget과 비교하면 curl은 더 다양한 프로토콜과 HTTP 요청을 지원하며, wget은 주로 파일 다운로드에 최적화되어 있다.

'Theory > OS' 카테고리의 다른 글

운영체제 이론 (2)  (0) 2025.03.14
운영체제 이론 (1)  (0) 2025.03.13
M4 Pro 맥북에서 VMware Fusion을 활용한 Ubuntu 실습 환경 구축  (1) 2025.03.05