• Home
  • About
  • Posts
  • 1. 기본

    • 1.1. 명령어

      • 1.1.1. apt-get
      • 1.1.2. cat
      • 1.1.3. cd
      • 1.1.4 cp
      • 1.1.5 curl
      • 1.1.6 echo
      • 1.1.7 grep
      • 1.1.8 find
      • 1.1.9 head
      • 1.1.10 history
      • 1.1.11 ls
      • 1.1.12 mkdir
      • 1.1.13 mv
      • 1.1.14 pwd
      • 1.1.15 rm
      • 1.1.16 tail
      • 1.1.17 tar
      • 1.1.18 touch
      • 1.1.19 which
    • 1.2 환경 변수

      • 1.2.1. 쉘 환경변수
      • 1.2.2. 전역 환경변수
      • 1.2.3. 쉘 설정파일
      • 1.2.4. 예약 환경변수
    • 1.3. 리다이레션 및 다중명령어

      • 1.3.1. 스트림
      • 1.3.2. 리다이렉션
      • 1.3.3. 파이프
    • 1.4. 쉘 스크립트

      • 1.4.1. 변수
      • 1.4.2. 문자열 비교 연산
      • 1.4.3. 산술 비교 연산
      • 1.4.4. 논리 연산
      • 1.4.5. 파일 연산
      • 1.4.4. if 문
      • 1.4.5. case 문
      • 1.4.6. for 문
      • 1.4.7. while 문
  • 2. 프로세스

    • 2.1. 용어
    • 2.2. 명령어(ps)
  • 3. systemctl

    • 3.1. systemd
    • 3.2. daemon
    • 3.2 .service
    • 3.3. 명령어
  • 4. 사용자 및 권한

    • 4.1. 사용자

      • 4.1.1. 유저 생성/수정/삭제
      • 4.1.2. 그룹 생성/수정/삭제
    • 4.2. 권한

      • 4.2.1. 파일 소유권 수정(chown)
      • 4.2.2. 파일 권한 수정(chmod)
  • 5. 링크

    • 5.1. 용어
    • 5.2. 명령어(ln)

Linux Commands & Shell Scripts

📅 2023-03-14
🖋️ Byongho96
  • 1. 기본
    • 1.1. 명령어
      • 1.1.1. apt-get
      • 1.1.2. cat
      • 1.1.3. cd
      • 1.1.4 cp
      • 1.1.5 curl
      • 1.1.6 echo
      • 1.1.7 grep
      • 1.1.8 find
      • 1.1.9 head
      • 1.1.10 history
      • 1.1.11 ls
      • 1.1.12 mkdir
      • 1.1.13 mv
      • 1.1.14 pwd
      • 1.1.15 rm
      • 1.1.16 tail
      • 1.1.17 tar
      • 1.1.18 touch
      • 1.1.19 which
    • 1.2 환경 변수
      • 1.2.1. 쉘 환경변수
      • 1.2.2. 전역 환경변수
      • 1.2.3. 쉘 설정파일
      • 1.2.4. 예약 환경변수
    • 1.3. 리다이레션 및 다중명령어
      • 1.3.1. 스트림
      • 1.3.2. 리다이렉션
      • 1.3.3. 파이프
    • 1.4. 쉘 스크립트
      • 1.4.1. 변수
      • 1.4.2. 문자열 비교 연산
      • 1.4.3. 산술 비교 연산
      • 1.4.4. 논리 연산
      • 1.4.5. 파일 연산
      • 1.4.4. if 문
      • 1.4.5. case 문
      • 1.4.6. for 문
      • 1.4.7. while 문
  • 2. 프로세스
    • 2.1. 용어
    • 2.2. 명령어(ps)
  • 3. systemctl
    • 3.1. systemd
    • 3.2. daemon
    • 3.2 .service
    • 3.3. 명령어
  • 4. 사용자 및 권한
    • 4.1. 사용자
      • 4.1.1. 유저 생성/수정/삭제
      • 4.1.2. 그룹 생성/수정/삭제
    • 4.2. 권한
      • 4.2.1. 파일 소유권 수정(chown)
      • 4.2.2. 파일 권한 수정(chmod)
  • 5. 링크
    • 5.1. 용어
    • 5.2. 명령어(ln)

1. 기본

  • 커널 (Kernel)
    커널은 운영체제의 핵심 부분으로, 시스템 자원을 관리하고, 프로세스 관리, 메모리 관리, 파일 시스템, 네트워크 등의 기능을 제공합니다.
  • 쉘 (Shell)
    쉘은 사용자와 커널 사이에서 사용자의 명령어를 해석하고 실행하는 소프트웨어이다. 대표적인 쉘로는 bash, zsh, fish 등이 있다.

  • 터미널 (Terminal) 터미널은 텍스트 기반 인터페이스를 제공하는 소프트웨어이다.터미널은 쉘을 실행하고, 쉘에서 실행한 명령어의 출력을 사용자에게 보여준다.

  • 콘솔 (Console) 콘솔은 주로 하드웨어적인 의미로, 컴퓨터의 키보드와 모니터 등의 입출력 장치를 의미한다.

각각의 터미널에서 bash 쉘을 실행하면, 두 개의 bash 쉘이 서로 다르다. 즉, 각각의 쉘은 독립적으로 실행되며, 때문에 서로의 변수나 상태를 공유하지 않는다.

1.1. 명령어

1.1.1. apt-get

apt는 Linux 계열 시스템의 패키지 관리 툴이다.

# 설치된 패키지 업데이트
$ apt-get update

# 패키지 설치
$ apt-get install PACKAGE

# 패키지 업데이트
$ apt-get update PACKAGE

# 패키지 삭제, --purge 옵션으로 일부 남을 수 있는 구성까지 모두 삭제
$ apt-get --purge remove PACKAGE

1.1.2. cat

concatenate의 약자로 파일을 표준 출력으로 출력하는 명령어이다. 리다이렉션(>)이나 파이프(|)연산자와 결합하여 다양하게 사용된다.

# 파일 출력
$ cat FILE

# 내용 입력 후 (ctrl+D)눌러서 파일 생성
$ cat > FILE

# 라인마다 번호 출력
$ cat -n FILE

# 공백 라인 제외하고, 라인마다 번호 출력
$ cat -b FILE

# 반복된 공백 라인 하나로 처리해서 출력
$ cat -s FILE

# 파일 복사
$ cat FILE > COPY

# 파일 합치기
$ cat FILE1 FILE2 > FILE1_2

# 파일 추가
$ cat FILE2 >> FILE1

# 파일을 페이지 단위로 출력(엔터 입력 시 한 줄 더 출력, 스페이스바 입력 시 한 페이지 더 출력)
$ cat FILE | more

# 특정 문자열을 포함한 라인만 출력
$ cat FILE | grep "STR"

# 현재 디렉토리 모든 파일 출력
$ cat *

# 현재 디렉토리 특정 확장자의 모든 파일 출력
$ cat *.txt

1.1.3. cd

change directory의 약자로 현재 디렉토리에서 다른 작업 디렉토리로 이동할때 사용하는 명령어이다.

# 상위 디렉토리로 이동
$ cd ..

# 홈 디렉토리로 이동
$ cd ~

# 상대경로로 이동
$ cd foo/bar

# 절대경로로 이동
$ cd /home/foo/bar

1.1.4 cp

copy의 약자로 파일을 복사할 때 사용된다.

# 파일 -> 파일
$ cp FILE1 FILE2

# 파일 -> 디렉토리
$ cp FILE1 /home/foo/bar

# 여러 파일 -> 디렉토리
$ cp FILE1 FILE2 /home/foo/bar

# 디렉토리 -> 디렉토리
$ cp -r /home/foo /home/bar

1.1.5 curl

curl(client url)는 URL로 데이터를 보내거나 가져올때 사용한다. 간단히 말한 커맨드라인에서 REST API 테스트할 수 있다.

# -X: 요청 메소드를 설정. default값은 GET이다.
curl  www.example.com
curl -X GET www.example.com
curl -X PUT -d 'name=mkyong&email=abc@gmail.com' http://localhost:8080/user/100

# -H: 헤더 옵션 설정
$ curl -d "key1=value1&key2=value2" \
-H "Content-Type: application/x-www-form-urlencoded" \
-X POST http://localhost:8000/data

# -d: body 데이터 설정
# # url 형식 데이터
$ curl -d "key1=value1&key2=value2" \
-H "Content-Type: application/x-www-form-urlencoded" \
-X POST http://localhost:8000/data
# # json 형식 데이터
$ curl -d '{"key1":"value1", "key2":"value2"}' \
-H "Content-Type: application/json" \
-X POST http://localhost:8000/data

# -L: 301, 302 응답을 받을 경우 리다이렉션을 따름

# -o / -O: 응답을 저장할 파일의 이름을 설정
# # 직접 파일 이름을 지정(python.tar.bz2)
$ curl -o python.tar.bz2 https://downloads.python.org/pypy/pypy3.7-v7.3.4-linux64.tar.bz2
# # 미리 정의된 파일 이름을 그대로 사용(pypy3.7-v7.3.4-linux64.tar.bz2)
$ curl -O https://downloads.python.org/pypy/pypy3.7-v7.3.4-linux64.tar.bz2

1.1.6 echo

문자열 혹은 변수를 표준 출력으로 출력한다.

# 문자열 출력
$ echo print this message
$ echo "print this message"

# -e: 문자열에서 이스케이프 문자를 인식
$ echo -e "print \n this message"

# 파일로 리이렉트
$ echo "save this message" > FILE
$ echo "add this message" >> FILE

# 변수 출력
$ A=123
$ echo $A
$ echo "The Result is $A"

# 명령어 결과를 출력
$ echo "Current directory is $(pwd)"
$ echo "1 + 2  == $((1 + 2))"

1.1.7 grep

입력으로 전달된 파일, 혹은 표준 입력에서 특정 문자열 패턴(정규식)을 찾는다.

# 파일에서 특정 문자열 검색
$ grep "STR" FILE

# 현재 디렉토리 모든 파일에서 특정 문자열 검색
$ grep "STR" *

# -i: 대소문자 구분하지 않고 문자열 검색
$ grep -i "STR" FILE

# -v: 매칭되는 문자열이 없는 라인 검색
$ grep -v "STR" FILE

# 현재 디렉토리 및 하위 모든 디렉토리의 파일 검색
$ grep -r "STR" *

# 문자열 출력시 파일 이름도 함께 출력
$ grep -H "STR" *

# 문자열 출력시 라인 번호도 함께 출력
$ grep -n "STR" *

# 찾으려는 패턴 문자열을 정규식이 아닌 일반 문자열로 인식
$ grep -F "STR" FILE

1.1.8 find

리눅스 파일 시스템에서 파일을 검색하는 데 사용되는 명령어이다.

# 현재 디렉토리에서 test가 포함되는 파일 찾기
$ find -name "*test*"

# 모든 디렉토리에서 test가 포함되는 파일 찾기
$ find / -name "*test*"

# 현재 및 하위 디렉토리에서 test가 포함되는 파일 찾기
$ find . -name "*test*"

# 현재 디렉토리에서 .txt 확장자 모두 찾기
$ find  -name "*.txt"

# 현재 디렉토리에서 test로 시작되는 파일 찾기
$ find -name "test*"

# 현재 디렉토리에서 test로 끝나는 파일 찾기
$ find -name "*test"

# 현재 디렉토리에서 모든 디렉토리 찾기
$ find -type d

# 현재 디렉토리에서 test가 들어가는 디렉토리 찾기
$ find -name "*test*" -type d

# 현재 디렉토리에서 모든 파일 찾기
$ find -type f

1.1.9 head

파일의 상단 일부를 출력하기 위한 명령어이다.

# 파일의 상단 10줄 출력
$ head FILE

# 파일의 상단 100줄 출력
$ head -num 100 FILE

1.1.10 history

사용한 커맨드 내역을 출력하기 위한 명령어이다.

# 사용한 명령어를 모두 출력(최대 500개)
$ history

# 사용한 명령어 중 최근 몇개를 출력
$ history 7

# 특졍 커맨드가 포함된 명령어를 출력
$ history | grep CMD

1.1.11 ls

지정된 디렉토리의 파일 및 디렉토리 목록을 출력한다

# 파일을 알파벳 순으로 출력
$ ls

# -a: 숨겨진 파일이나 디렉토리도 출력
$ ls -a

# -l: 권한, 포함 파일 수, 소유자, 그룹, 파일크기, 수정일자 등 자세한 내용을 출력
$ ls -l

# -s: 파일을 크기 순으로 출력
$ ls -s

# -r: 파일을 역순으로 출력
$ ls -r

# -R: 하위 디렉토리까지 출력
$ ls -R

# -h: 파일 크기를 사람(human)이 보기 좋게 표시하여 출력
$ ls -u

1.1.12 mkdir

새로운 디렉토리를 생성하고 싶을 때 사용한다.

# 현재 경로에 디렉토리 생성
$ mkdir DIR

# 절대 경로에 디렉토리 생성
$ mkdir /home/foo/bar/DIR

# 현재 경로에 여러 개의 디렉토리 생성
$ mkdir DIR1 DIR2 DIR3

# 상위 디렉토리를 포함하여 새로 생성 (home, foo, bar 디렉토리도 없을 경우 생성)
$ mkdir -p /home/foo/bar/DIR

1.1.13 mv

move의 약자로 파일을 이동할 때 사용된다.

# 파일 이동(이름변경)
$ mv FILE1 FILE2

# 파일 -> 디렉토리로 이동
$ mv FILE1 DIR/

# 여러 파일 -> 디렉토리로 이동
$ mv FILE1 FILE2 DIR/

# 디렉토리 이동(이름변경)
$ mv DIR1/ DIR2/

1.1.14 pwd

Print Working Directory의 약자로 현재 작업경로를 절대경로로 출력한다

# 현재 위치 절대경로로 출력
$ pwd

1.1.15 rm

파일이나 디렉토리를 살제하는 명령어이다.

# 파일 삭제
$ rm FILE

# 디렉토리 삭제
$ rm -r DIR

# 파일/디렉토리 삭제 시 확인메시지 출력하지 않음
$ rm -rf DIR

1.1.16 tail

파일의 하단 일부를 출력하기 위한 명령어이다.

# 파일의 하단 10줄 출력
$ tail FILE

# 파일의 허단 100줄 출력
$ tail -num 100 FILE

1.1.17 tar

여러 파일을 하나의 파일(.tar)로 묶을 수 있고, 이어서 gzip 또는 bzip2 형태로 압축할 수 있다. tar형태의 파일은 묶여지기 전 파일들의 속성과 심볼릭 링크, 디렉토리 구조 등을 그대로 가져갈 수 있다.

-f     : 대상 tar 아카이브 지정. (기본 옵션)
-c     : tar 아카이브 생성. (파일 묶을 때 사용)
-x     : tar 아카이브에서 파일 추출. (파일 풀 때 사용)
-v     : 처리되는 과정(파일 정보)을 나열.
-z     : gzip 압축 적용 옵션.
-j     : bzip2 압축 적용 옵션.
-t     : tar 아카이브에 포함된 내용 확인.
-C     : 대상 디렉토리 경로 지정.

# 현재 디렉토리의 모든 파일과 디렉토리를 tar로 묶기
$ tar cvf T.tar *

# 대상 디렉토리를 포함한 모든 파일과 디렉토리를 tar로 묶기
$ tar cvf T.tar [PATH]

# 파일을 지정하여 tar로 묶기
$ tar cvf T.tar [FILE_1] [FILE_2]

# tar 아카이브를 현재 디렉토리에 풀기
$ tar xvf T.tar

# tar 아카이브를 지정된 디렉토리에 풀기
$ tar xvf T.tar -C [PATH]

# tar 아카이브의 내용 확인
$ tar tvf T.tar

# 현재 디렉토리를 tar로 묶고 gzip으로 압축하기
$ tar zcvf T.tar.gz *

# gzip으로 압축된 tar 아카이브를 현재 디렉토리에 풀기
$ tar zxvf T.tar.gz

# 현재 디렉토리를 tar로 묶고 bzip2로 압축하기
$ tar jcvf T.tar.bz2 *

# bzip2로 압축된 tar 아카이브를 현재 디렉토리에 풀기
$ tar jxvf T.tar.bz2

1.1.18 touch

파일을 생성할 때 사용하는 명령어

# 현재 디렉토리에 파일 생성
$ touch FILE

1.1.19 which

명령어의 위치를 찾을 때 사용하는 명령어

# 특정 커맨드의 위치를 검색
$ which CMD

1.2 환경 변수

리눅스에서 시스템 또는 사용자의 환경에 영향을 미치는 변수. 쉘에 의해 관리되며, 터미널에서 사용되는 명령어에서 참조될 수 있다.

1.2.1. 쉘 환경변수

export 없이 선언된 변수로써, 현재 쉘 세션에서만 유효하다. 하위 쉘에서는 유효하지 않다.

$ A=abc
$ echo $A

1.2.2. 전역 환경변수

export와 함께 선언된 변수로써, 현재 쉘과 하위 쉘에서 유효한다. 하지만 여전히 다른 쉘에서는 사용할 수 없다.

$ export A=abc
$ echo $A

1.2.3. 쉘 설정파일

쉘이 실행될때마다 자동으로 실행되는 스크립트 파일로써, 쉘에서 사용하는 변수나 함수를 설정하는데 쓰인다.

쉘 설정파일의 실행순서는 아래와 같다. /etc/profile → /etc/bashrc → ~/.bash_profile → ~/.bashrc → ~/.bash_logout

  • /etc/profile
    로그인 시 시스템 전체 환경(모든 사용자)에 적용되는 환경설정 파일이다. 전역변수를 선언할 때 사용되지만, 꼭 필요한 상황에서만 사용하는 것을 권장한다.
  • /etc/bashrc
    시스템 전체 환경(모든 사용자)에 적용되는 환경설정 파일이다. 전역으로 사용하게 될 함수나 별칭을 추가하여 사용하는 것을 권장한다. 비로그인 쉘에서도 적용된다.
  • ~/.bash_profile
    사용자 별로 적용되는 설정 파일로, 해당 사용자에게만 적용되는 변수를 설정한다. /etc/profile보다 나중에 적용되어 전역변수를 덮어쓸 수 있다.
  • ~/.bashrc
    사용자 별로 적용되는 설정 파일로, 해당 사용자에게만 적용되는 함수나 별칭을 추가하여 사용하는 것을 권장한다. /etc/bashrc보다 나중에 적용되어 전역함수를 덮어쓸 수 있다.

1.2.4. 예약 환경변수

쉘 프로그램이 시작될 때 자동으로 설정되는 환경 변수이다.일반적으로 쉘 설정 파일(예: ~/.bashrc, ~/.bash_profile)에서 설정되지 않으며 쉘 프로세스의 메모리 공간에 있는 환경변수 테이블에서 관리된다.

# 전체 환경변수 확인 명령어
$ env

BASH        사용하는 bash 쉘 경로
COLUMNS     터미널 컬럼 수
DISPLAY     X 디스플레이 이름
EDITOR      기본 편집기
HISTFILE    history 파일 경로
HISTSIZE    history에 저장되는 개수
HOME        사용자 홈 디렉토리
HOSTNAME    호스트 이름
LANG        기본 언어
LINES       터미널 라인 수
LOGNAMES    로그인 이름
MAIL        메일을 보관하는 경로
MANPATH     man 페이지 경로
OSTYPE      운영체제 타입
PATH        실행 파일 경로
PS1         명령 프롬프트변수
PWD         현재 작업 디렉토리
SHELL       로긴 쉘
TERM        터미널 타입
UID         사용자 UID
USER        사용자 이름
VISUAL      Visual 편집기

1.3. 리다이레션 및 다중명령어

1.3.1. 스트림

리눅스의 표준입력 스트림, 표준 출력 스트림, 표준 오류 스트림은 기본적으로 다음의 파일 디스크립터를 할당받는다. 파일 디스크립터(fd)는 프로세스가 파일에 접근하기 위해 제공되는 고유 식별자이다.

종류 영문 파일 디스크립터
표준 입력 스트림 stdin 0
표준 출력 스트림 stdin 1
표준 오류 스트림 stdin 2

표준 출력(덮어쓰기) > 명령어 > 파일 명령어의 표준 출력 스트림의 도착 지점을 파일로 설정(덮어쓰기) 표준 출력(추가) » 명령어 » 파일 명령어의 표준 출력 스트림의 도착지점 파일에 내용 추가 표준 입력 < 명령어 < 파일 파일로부터 입력 받음

1.3.2. 리다이렉션

종류 기호 사용법 설명
표준 출력 덮어쓰기 > 명령어 > 파일 명령어의 표준 출력 스트림의 도착 지점을 파일로 설정
표준 출력 추가하기 >> 명령어 >> 파일 명령어의 표준 출력 스트림의 도착 지점을 파일에 추가
표준 입력 받아오기 < 명령어 < 파일 파일로부터 표준 입력을 입력받음
# ls 명령어의 결과를 출력하지 않고, ls_list.txt로 저장함
$ ls > ls_list.txt

# ls 명령어의 결과를 출력하지 않고, ls_list.txt에 이어 씀
$ ls >> ls_list.txt

# 표준 입력(키보드)이 아니라 파일로부터 표준 입력을 받는다
$ tail -n 2 < ls_list.txt

# 2>&1: 오류 출력(2)를 표준 출력(1)으로 받는다. 1앞의 &은 1이 파일 디스크립터임을 알려준다.
$ 2>&1

# /dev/null: dev/null로 리다이렉트 시킨다는 말은, 데이터가 없애고 출력하지 않는다는 의미이다.
$ /script.sh > /dev/null 2>&1 # 출력과 에러 모두 보지 않겠다

1.3.3. 파이프

이전 프로세스의 표준 출력을 다음 프로세스의 표준 입력으로 받는다.

# 예시) 현재 디렉토리에서 최근 10개 파일을 표시
$ ls -lt | head

1.4. 쉘 스크립트

리눅스 명령어들을 하나의 스크립트 파일에 묶어 선언한 것으로써, 명령어를 기능 단위로 실행할 수 있다.

쉘 스크립트 파일은 첫번째 행에 어떤 쉘로 스크립트를 실행할지 정의해야 한다. 유닉스 쉘에는 여러 종류가 있지만, 현재 대부분 bash쉘을 사용한다.

쉘에서 선언된 변수는 기본적으로 전역 변수(global variable)다

#!/usr/bin/bash

...코드

1.4.1. 변수

쉘 커맨드 및 스크립트에서 변수는 기본적으로 문자열로 할당된다

  • arguments
    쉘스크립트 실행시 전될되는 인자들이 변수로 할당된다.
    $0	쉘 스크립트명
    $1	첫번째 arguemnt
    $2	두번째 argument
    $3...
    $#	argument 갯수
    $$	쉘 스크립트의 PID
    
  • $() 쉘 커맨드의 실행 결과를 문자열로 반환한다.
  • ${} 선언된 변수를 사용한다. $ 만으로도 변수를 읽어오지만 다른 문자열들이 앞뒤로 사용될 때 정확한 변수명을 지정하기 위해 {}가 같이 사용된다.

1.4.2. 문자열 비교 연산

산술 비교 연산자 설명
var1 = var2 var1과 var2가 같은 경우 true를 반환함
var1 == var2 var1과 var2가 같은 경우 true를 반환함
var1 != var2 var1과 var2가 다른 경우 true를 반환함
-z var1 var1의 길이가 0인 경우 true를 반환함
-n var1 var1의 길이가 0이 아닌 경우 true를 반환함
  • 이중 대괄호
    &&, ||, = ~ * (정규식 매칭) 과 같은 확장 expression test 기능을 대괄호 내에 사용할 수 있다.

    if [[ $a == z* ]]    # $a 가 "z"로 시작할 경우 (패턴매칭)
    if [[ $a == "z*" ]]  # $a 가 z* 와 같을 경우
    
    if [ "$a" == "z*" ]  # $a 가 z* 와 같다면 참
    if [ $a == z* ]      # 파일 globbing이나 낱말 조각남이 일어남
    

1.4.3. 산술 비교 연산

산술 비교 연산자 설명
var1 -eq var2 var1과 var2가 같은 경우 true를 반환함
var1 -ne var2 var1과 var2가 다른 경우 true를 반환함
var1 -gt var2 var1가 var2보다 큰 경우 true를 반환함
var1 -lt var2 var1가 var2보다 작은 경우 true를 반환함
var1 -ge var2 var1가 var2 이상인 경우 true를 반환함
var1 -le var2 var1가 var2 이하인 경우 true를 반환함
((var1 > var2)) var1가 var2보다 큰 경우 true를 반환함
((var1 < var2)) var1가 var2보다 작은 경우 true를 반환함
((var1 >= var2)) var1가 var2 이상인 경우 true를 반환함
((var1 <= var2)) var1가 var2 이하인 경우 true를 반환함
  • 이중 괄호 expression 에는 수식이나 비교 표현식이 들어갈 수 있다.

    if (( ${num1} < ${num2} ))
    

1.4.4. 논리 연산

논리 연산자 설명 예시
-a 논리 and if [ $a -eq 0 -a $b -eq 1 ]
-o 논리 or if [ $a -eq 0 -o $b -eq 1 ]
&& 논리 and if [ $a -eq 0 ] && [ $b -eq 1 ]
if [[$a -eq 0 && $b -eq 1]]
|| 논리 or if [ $a -eq 0 ] || [ $b -eq 1 ]
if [[$a -eq 0 || $b -eq 1]]

1.4.5. 파일 연산

파일 연산자 의미 표현
-d is directory if [ -d FILE ]
-f is file if [ -f FILE ]
-e does exist if [ -e FILE ]
-r is readable if [ -r FILE ]
-w is writable if [ -w FILE ]
-x is executable if [ -x FILE ]
-nt is newer than if [ FILE1 -nt FILE2 ]
-ot is older than if [ FILE1 -ot FILE2 ]

1.4.4. if 문

if [ 조건식 ]; then
    명령어
elif [ 조건식 ]; then
    명령어
else
    명령어
fi

1.4.5. case 문

COUNTRY=korea

case $COUNTRY in
  "korea"|"japan"|"china") # or 연산도 가능하다
    echo "$COUNTRY is Asia"
    ;;
  "USA"|"Canada"|"Mexico")
    echo "$COUNTRY is Ameria"
    ;;
  * )
    echo "I don't know where is $COUNTRY"
    ;;
esac

1.4.6. for 문

for ((i=1; i<=4; i++)); do
    echo $i
done

for x in 1 2 3 4 5
do
    echo "${x}"
done

1.4.7. while 문

count=0
while [ ${count} -le 5 ];
do
    echo ${count}
    count=$(( ${count}+1 ))
done

2. 프로세스

2.1. 용어

  • UID
    User ID. 사용자 ID
  • PID
    Process ID. 운영체제에서 프로세스를 식별하기 위한 ID
  • PPID
    Parent Process ID. 부모 프로세스의 PID
  • PGID
    Process Group ID. 1개 이상의 프로세스의 그룹을 식별하기 위한 ID
  • SID
    Session ID. 1개 이상의 프로세스의 그룹의 묶음을 식별하기 위한 ID

2.2. 명령어(ps)

ps 명령어 입력 시 나오는 테이블의 항목에 대한 세부내용은 다음과 같다

칼럼 설명
C CPU 사용량(%)
TTY 프로세스를 시작한 터미널
RSS 메모리 사용량
TIME 프로세스 총 가동시간
STIME 프로세스 시작시간
CMD 해당 프로세스를 시작하는데 쓰인 명령어
명령어 설명
ps 현재 사용자가 실행 중인 프로세스
ps -e 모든 사용자가 실행 중인 프로세스
ps -f 프로세스 상세정보 출력
ps -p [PID] 특정 프로세스 정보 출력
ps -u [UID] 특정 사용자가 실행 중인 프로세스 정보 출력
ps -H 인덴트로 부모 자식 관계 시각화
ps -ef | grep [keyword1] | grep -v [keyword2] CMD에 keyword1을 포함하고 keyword2를 포함하지 않은 프로세스 필터링

3. systemctl

3.1. systemd

systemd는 Linux 운영체제의 시스템 서비스(데몬)를 동작 원리와 관계없이 일관된 인터페이스를 제공한다. 여러 개의 서비스를 병렬적으로 수행할 수 있기 때문에 확장성에 용이하고, 사용자에 따라 프로세스를 구분하여 관리할 수 있다. 또한 서비스 간 의존성 추적, 로그 기록 관리 등의 기능을 통해 트러블 슈팅을 쉽게 해결할 수 있다.

systemd components

3.2. daemon

데몬이란 시스템 서비스라고도 불리며, 사용자와의 상화작용 없이 컴퓨터 백그라운드에서 돌아가는 프로글메을 말한다. 보통 시스템(컴퓨터)가 켜짐과 동시에 자동으로 시작된다. 리눅스 운영체제에서 데몬은 systemd에 의해서 관리된다.

데몬은 사용자 레벨에서 접근할 수 없는 기능들을 동작시키는데 유용하다. 예를 들어 웹 서버, 데이터 서버 등의 다른 프로그램을 동작시키거나 하드웨어 디바이스와 상호작용할 때 쓰인다.

3.2 .service

.service 파일은 unit 설정 파일이라고 불리며, 리눅스 운영체제에서 systemd가 관리할 시스템 서비스를 정의한다. /etc/systemd/system 디렉토리에 .service 파일을 위치시키면 systemd가 해당 서비스를 설정파일에 따라 관리하기 시작한다.

기본적으로 systemd 서비스의 이름은 /etc/systemd/system 디렉토리에 있는 장치 파일명으로 결정된다. (서비스 이름은 systemctl커맨드 사용 시, .service 확장파일을 확장자명 없이 지칭할 수 있는 별칭을 의미한다.) 필요에 따라서 [INSTALL] 섹션에 Aias 옵션을 통해 서비스 이름을 설정파일과 다르게 설정할 수 있다.

하나의 서비스는 하나 이상의 프로세스를 생성하며, 그 중 메인 프로세스가 해당 서비스와 직접적인 연결관계를 가진다.

[UNIT]
Description
// 서비스 설명으로, 서비스의 로그에 기록된다.

After
// 본 서비스 이전에 실행해야 할 서비스

Before
// 본 서비스 이후에 실행해야 할 서비스

Requires
// 본 서비스와 반드시 함께 실행해야 할 서비스

Wants
// 본 서비스와 함께 실행할 서비스 (실행되지 않더라도 본서비스는 실행됨)

[SERVICE]
Type
// 서비스의 시작 유형을 지정한다. [simple | forking | oneshot | dbus | notify | idle]
// simple : deafult값. systemd가 서비스에 대해 장기간 실행을 기대하는 메인 프로세스를 생성한다. -> 프로세스 종료 시 실패로 간주한다.
// forking : systemd가 생성한 메인 프로세스는 자식 프로세스를 fork하고, 메인 프로세스 자격을 넘겨 준뒤 종료된다. 자식 프로세스의 PID를 PIDFlie옵션에 정의된 경로에 저장한다.
// oneshot : systemd가 서비스에 대해 단기간 실행을 기대하는 메인 프로세스를 생성한다. -> 프로세스 완료 시 성공으로 간주하고, 장기간 구동 시 실패로 간주한다.
// dbus : D-Bus 서비스(프로세스간 통신)임을 명시한다.
// notify : 프로세스가 요청을 수락할 준비가 되었을 때, systemd에 알람을 보낸다. -> 데이터베이스 서버와 같이 시작하는데 시간이 걸리는 서비스에 유용하다.

Environment
//서비스에 사용할 환경 변수를 선언한다.
EnvironmentFile
//서비스의 환경설정을 파일을 지정한다.

ExecStartPre
ExecStart
ExecStartPost
ExecStop
ExecStopPost
// 각각의 상황에 맞는 명령어 혹은 명령어를 지정한다.
// Ex 1.
// ExecStart=/usr/bin/python3 /path/to/script.py
// Ex 2.
// ExecStart=/bin/bash /path/to/script.sh
// Ex 3.
// ExecStart=/bin/bash /path/to/script.sh arg1 arg2

KillMode
// 프로세스가 어떻게 중지 되는지 결정 [control-group|process|none]
// control-group : 해당 서비스가 포함된 그룹의 모든 서비스를 중지 시킨다.
// process : 해당 서비스의 메인 프로세스만 중지 시킨다.
// none : defualt값. 아무런 행동도 하지 않는다.

PIDFile
// 서비스가 자신의 pid를 기록한다. (Type=forking 옵션과 함께 자주 사용된다.)
// PIDFILE = /var/run/myservice.pid

Restart
// 서비스 종료 시, 재시작 설정	[no | on-success | on-failure | on-watchdog | on-abort | always ]
// no: defualt 값.
// on-success: 프로세스가 성공적으로 종료(status가 0) 시 재시작
// on-failure: 프로세스가 실패(status가 0이 아님) 시 재시작
// always: 무조건 재시작

RestartSec
// 서비스 재시작까지 대기하는 시간. 기본값 100ms

User
// 해당 서비스를 실행할 주체를 설정. (서비스 실행과 관련된 권한을 가지고 있어야 한다.)
// default 값 root. 보안상의 이유로 추천하지 않는다.

Group
// User가 포함된 그룹을 지정.
// default 값 primary group of the user.

[INSTALL]
WantedBy
// Wants의 반대 관계를 명시한다.

Also
// 함께 enable, disable할 serivce들을 지정.

Alias
// service의 별칭 설정.

3.3. 명령어

명령어 설명
systemctl daemon-reload systemd 서비스 업데이트
systemctl start [SERVICE] 서비스 시작
systemctl stop [SERVICE] 서비스 중지
systemctl restart [SERVICE] 서비스 재시작
systemctl enable [SERVICE] 부팅 시 서비스 자동시작
systemctl disable [SERVICE] 부팅 시 서비스 자동시작 해제
systemctl list-units --type=service 서비스 목록 확인
journalctl -u [SERVICE] 서비스 로그 기록 확인

4. 사용자 및 권한

4.1. 사용자

리눅스는 다중 사용자 운영체제로, 하나 이상의 사용자 계정을 생성하고 동시접속할 수 있다. root 권한이 있는 유저만 사용자를 관리할 수 있다.

또한 모든 사용자는 하나 이상의 그룹에 속해있고, 계정 생성 시 따로 지정하지 않을 경우 users 그룹에 자동으로 할당된다. 각각의 그룹은 식별가능한 고유의 그룹아이디(gid)를 가진다.

4.1.1. 유저 생성/수정/삭제

# 사용자 목록 확인
$ cat /etc/passwd

# 유저 정보 조회
$ id USER

# 유저 생성
$ useradd USER

# 유저 패스워드 생성 및 변경
$ passwd USER

# 유저 정보 수정
$ userpmod [options] [value] USER

# 유저와 관련 파일 모두 삭제
$ userdel -rf USER

4.1.2. 그룹 생성/수정/삭제

# 그룹 목록 확인
$ cat /etc/group

# 그룹 정보 조회
$ groups GROUP

# 그룹 생성. -g 옵션으로 지정하지 않을 경우, gid는 1000번부터 순차적으로 생성됨
$ groupadd -g 1020 GROUP

# 그룹 정보 수정
$ groupmod [options] [value] GROUP

# 그룹 강제 삭제
$ groupdel -f GROUP

# 그룹 암호 설정
$ gpasswd GROUP

# 그룹 암호 제거
$ gpasswd -r GROUP

# 그룹 사용자 추가
$ gpasswd -a USER GROUP

# 그룹 사용자 제거
$ gpasswd -d USER GROUP

4.2. 권한

각각의 파일/디렉토리는 소유 유저 / 소유 그룹 / 모든 유저 에 대한 읽기(r), 쓰기(w), 실행(x) 권한을 분리해서 관리한다. 소유 사용자는 파일을 생성한 유저, 소유 그룹은 파일을 생성한 유저의 기본그룹으로 기본 할당된다. 이에 대한 정보는 ls 명령어 실행 시 -l 옵션을 넣어 확인할 수 있다.

$ ls -l

-rw-r--r-- 1 ppotta manager 17 Mar 24 03:17 FILE
# 첫번째 '-' 를 제외하고 차례대로 소유 유저 / 소유 그룹/ 모든 사용자에 대한 권한을 rwx순으로 나열한다.
# 소유 유저는 읽기(r), 쓰기(w) 권한을 가진다.
# 소유 그룹은 읽기(r) 권한을 가진다.
# 모든 사용자는 읽기(r) 권한을 가진다.

또한 디렉토리에 대한 rwx 권한의 의미는 각각 다음과 같다.

  • r: 디렉토리에 있는 파일 및 디렉토리 리스트 읽기
  • w: 디렉토리에 파일 추가, 이름 변경, 삭제
  • x: 디렉토리에 접근. cd 명령으로 working directory 이동

4.2.1. 파일 소유권 수정(chown)

chown 명령어는 해당 파일의 소유자 및 root권한이 있는 사용자만 실행할 수 있다.

# 파일의 소유 유저 변환
chown USER FILE

# 파일의 소유 그룹 변환
chown .GROUP FILE

# 파일의 소유 유저와 그룹 변환
chown USER.GROUP FILE

# 디렉토리와 하위 파일의 소유권 변환
chown -R USER.GROUP DIR

4.2.2. 파일 권한 수정(chmod)

$ chmod u+x FILE                    # 파일 소유 사용자에게 실행권한 추가.

$ chmod u+w FILE                    # 파일 소유 사용자에게 쓰기 권한 추가.

$ chmod u=rwx FILE                  # 파일 소유 사용자에게 읽기, 쓰기, 실행 권한 지정.

$ chmod u-x FILE                    # 파일 소유 사용자의 실행 권한 제거.

$ chmod g+w FILE                    # 파일 소유 그룹에 쓰기 권한 추가.

$ chmod g-x FILE                    # 파일 소유 그룹의 실행 권한 제거.

$ chmod o=r FILE                    # 파일 소유 사용자 및 그룹을 제외한 사용자는 읽기만 가능.

$ chmod a-x *                       # 현재 디렉토리의 모든 파일에서 모든 사용자의 읽기 권한 제거.

$ chmod a-w FILE                    # 모든 사용자에 대해 쓰기 권한 제거.

$ chmod u=rwx,g=r FILE              # 파일 소유 사용자는 모든 권한, 그룹은 읽기만 가능.

$ chmod ug=rw FILE                  # 파일 소유 사용자와 그룹이 읽기, 쓰기 가능.

$ chmod g=rw,o=r FILE               # 파일 소유 그룹은 읽기, 쓰기 가능, 그 외 사용자는 읽기만 가능.

$ chmod ug=rw,o=r FILE              # 파일 소유 사용자 및 그룹은 일기, 쓰기 가능, 그외 사용자는 읽기만 가능.

$ chmod 000 FILE                    # 모든 사용자의 모든 권한 제거. = ---------

$ chmod 664 FILE                    # 사용자(읽기+쓰기), 그룹(읽기+쓰기), 그외 사용자(읽기) = rw-rw-r--

$ chmod 755 FILE                    # 사용자(읽기+쓰기+실행), 그룹(읽기+실행), 그외 사용자(읽기+실행) = rwxr-xr-x

$ chmod 777 FILE                    # 모든 사용자에 모든 권한 추가.

$ chmod -R g+x DIR                  # DIR 디렉토리 하위 모든 파일 및 디렉토리에 그룹 실행(x) 권한 추가.

$ chmod -R o-wx *                   # 현재 디렉토리의 모든 파일에서 그외 사용자의 쓰기, 실행 권한 제거

$ chmod -R a-x,a+X *                # 현재 디렉토리 기준 모든 파일 읽기 권한 제거, 디렉토리 실행 권한 추가.

$ chmod -R a-x+X *                  # 위(chmod -R a-x,a+X *)와 동일.

$ chmod u=g FILE                    # FILE의 그룹 권한 값을 사용자 권한으로 적용.
    $ ls -l
    -rwxr--r-- 1 ppotta manager   23 Mar 26 04:13 FILE
    $ chmod u=g FILE
    -r--r--r-- 1 ppotta manager   23 Mar 26 04:13 FILE

$ chmod u+g FILE                    # FILE의 사용자 권한에 그룹 권한 값을 추가.

5. 링크

5.1. 용어

softlink hardlink
  • i-node 파일을 식별하는 고유번호 ls명령어 사용 시 -i 옵션으로 확인 가능하다.
  • Hard Link
    동일한 i-node를 가리키는 파일을 하나 복사한다. 동일한 i-node를 가리키기 때문에 어느 파일을 수정하든지 모든 파일에 대해 동일하게 수정이 일어난다. 하지만 하나의 파일을 삭제 하더라도 다른 파일에 영향을 끼치지는 않는다.
  • Soft Link
    다른 i-node를 가리키는 파일을 복사한다. 그러나 생성된 복사본의 i-node가 원본의 i-node를 가리킨다. 하드 링크와 마찬가지로 어느 파일을 수정하든지 모든 파일에 대해 동일하게 수정이 일어난다. 그러나 원본 파일이 삭제될 경우 소프트링크는 더 이상 이용할 수 없다.

5.2. 명령어(ln)

명령어 설명
ln [SOURCE] [DEST] 하드 링크 생성
ln -s [SOURCE] [DEST] 소프트 링크 생성
rm [DEST] 링크 삭제
작성자 프로필
전체 글 (127)
  • Animation
    • Backend
      • Django
      • Spring
    • DevOps
      • AWS
      • CI&CD
      • Docker
      • Git
      • Gunicorn
      • Kubernetes
      • Nginx
    • Frontend
      • Gatsby
      • React
      • Vue
    • Knowledge
      • .etc
      • Algorithm
      • Data Structure
      • Database
      • Design Pattern
      • Interview
      • Network
      • Web
    • Language
      • CSS
      • HTML
      • Java
      • JavaScript
      • Linux
      • Python

    Copyright © 2023 Byongho96  & Powered by Gatsby