본문 바로가기

개발기술/빌드, 배포, 운영

쉘 커맨드 , 쉘 스크립트

리눅스 쉘 

  • 쉘은 사용자가 운영체제와 상호작용할 수 있도록 명령어를 입력받아 실행해주는 프로그램입니다.
  • 모든 것은 파일이라는 철학 아래에서 인터렉션이 파일을 읽고 쓰는 것처럼 이루어져있음 (마우스, 키보드 디바이스 관련 기술도 포함)리눅스의 철학은 여러 기본단위의 프로그램들이 유기적으로 각자의 역할을 하면서, 이를 조합하여 전체 시스템이 동작하도록함.
    • (ls | grep의 경우에도, lsgrep이란 명령어가 아닌 ls와 grep을 유기적으로 조합하여 사용함)
  • 리눅스에는 여러가지 shell이 있지만 ubuntu에서도 그렇고 bash shell이 범용으로 쓰이기에 bash 명령어 위주로 학습할것.
    • Bash: 기본적인 쉘로, 많은 시스템에서 기본으로 제공됩니다. 간단하고 강력하지만, Zsh에 비해 기능이 제한적입니다.
    • Zsh는 Bash(Bourne Again Shell)처럼 널리 사용되는 쉘 중 하나로, Bash와 유사하지만 더 많은 기능과 사용자 친화적인 확장성을 제공합니다.
  • 리눅스는 다중사용자를 전제로하며 사용자를 개인 그리고 그룹으로 구분하여 권한을 관리한다. root는 수퍼관리자이다.
  • 리눅스는 커널동작과의 복잡하고 다양한 내용이 있어 필요에 따른 선별적으로 공부가 필요하다.

기본문법

  • commands are parsed by spaces.
  • ; : 두개이상의 명령어를 구분할때 사용됨.  줄바꿈이 있으면 구분하지 않아도됨 
  • { ... } : 는 명령어 블록

제어 구조 (Control Structures) 

반복문

while [ 조건 ]; do
명령어
    done

 

명령어 블록

while [ 조건 ]; do echo "hello"; done

 

조건문 (Conditional Syntax)

yarn install && yarn build || { echo "❌ 빌드 실패"; exit 1; }

 

 

축약 조건문 

  • && : 앞 명령이 성공(0) 하면, 뒤 명령 실행
  • || : 앞 명령이 실패(1) 하면, 뒤 명령 실행

 test 조건식

참/거짓"은 성공/실패로 표현되는 셸의 관습(convention)으로 test의 결과값 확인가능

test 1 -eq 1
echo $?

 

조건식 연산자

  •  test라는 command대신 사용되는 괄호. [ 조건식 ] 안의 true/false를 판별하는 조건식을 연산하는 연산자
  • 각 괄호가 command처럼 인식되기때문에 조건식과 구분하여 띄어쓰기를 제대로 해줘야함.
  • [[]] 이중대괄호 : 변수값이 비어있어도 []에서 날수있는 에러를 방지하여 false로 처리해줌
if [ 조건1 ]; then
  # 조건1이 참일 때
elif [ 조건2 ]; then
  # 조건2가 참일 때
else
    # 둘 다 아닐 때
fi

 

숫자 비교 (정수 기준)

표현 의미 예시
-eq 같음 (equal) [ 5 -eq 5 ] → true
-ne 다름 (not equal) [ 5 -ne 3 ] → true
-gt 큼 (greater than) [ 7 -gt 4 ] → true
-lt 작음 (less than) [ 2 -lt 6 ] → true
-ge 크거나 같음 [ 5 -ge 5 ] → true
-le 작거나 같음 [ 3 -le 8 ] → true

 

문자열 비교

표현 의미 예시
= 같음 [ "$a" = "hello" ] → true
!= 다름 [ "$a" != "world" ] → true
-z 문자열이 비었는지 확인 [ -z "$str" ] → true if empty
-n 문자열이 비어있지 않은지 확인 [ -n "$str" ] → true if not empty
  • "변수" : 쉘 스크립트에서는 변수를 ""로 감싸도 변수로 인식할 수 있으며 변수값이 비어있을때 문법오류를 예방하기 위한 습관이다.

 

파일 비교

표현 의미 예시
-e file 파일 존재 여부 [ -e "./config.yaml" ] → true
-f file 일반 파일 여부 [ -f "./run.sh" ] → true
-d file 디렉토리 여부 [ -d "/home/user" ] → true
-r file 읽기 가능 여부 [ -r "notes.txt" ] → true
-w file 쓰기 가능 여부 [ -w "output.log" ] → true
-x file 실행 가능 여부 [ -x "script.sh" ] → true

 

  • 셸 빌트인 (Shell Builtins)
    • ./script.sh :  스크립트를 “새로운 셸 프로세스”에서 실행하는 방식입니다.
    • source setenv.sh : 쉘 스크립트 파일을 현재 쉘 세션 내에서 실행합니다. 즉, export, 함수 정의, alias 등을 보존.
      • . setenv.sh : '.'은 source와 동일하게 실행명령어임.
  • #  : 한 줄 주석

 

리눅스 쉘  사용법 정리

유용한 보조기능

  • Tab 키
    • 명령어 자동 완성: 터미널에서 명령어 입력 중 Tab 키를 누르면 자동 완성됩니다.
    • 명령어 제안: 명령어나 파일명의 일부를 입력하고 Tab 키를 두 번 누르면 가능한 명령어 목록을 표시합니다.
  •  위쪽 화살표: 이전에 입력했던 명령어들을 순환하며 다시 사용할 수 있습니다.

 

변수와 환경변수

  • 변수  : 쉘 내부에서 선언된 키-값 쌍. 자식 프로세스에는 전달되지 않음.
    • VAR=value some_command : 임시 환경변수로 해당 변수는 그 명령어가 실행되는 프로세스에만 전달됩니다
    • $변수명 :  변수를 가져오는 문법으로 환경변수는 이미 정의되어있기때문에 사용자 정의 없이 호출가능
  • 환경변수 : 환경변수로 등록한다는 것은 자식 프로세스에게 전달된다는 것입니다.
    • export $변수 : 이미 할당된 변수를 현재 셸의 환경변수로 등록하는 명령어. 선택된 변수를 해당 세션에서 생성된 하위 프로세스에게도 전달가능하게함

 

환경변수의 두 가지 유형

유형 설명 예시 설정 방법
시스템 환경변수 OS나 셸이 기본적으로 제공하는 환경변수 $PATH, $HOME, $PWD, $SHELL 시스템 또는 로그인 시 초기화 파일에서 자동 설정됨
사용자 정의 환경변수 사용자가 필요에 따라 설정한 환경변수 $NODE_ENV, $API_KEY, $DATABASE_URL 등 export VAR=값 또는 .env 파일

 

대표적인 시스템 환경변수 

  • $PATH : PATH라는 환경변수의 값을 참조. 
    • 터미널에 java, node, git 같은 명령어를 치면, 터미널은 $PATH에 지정된 폴더들을 차례대로 검색해서 실행 파일(바이너리)를 찾음. 새로운 바이너리를 CLI에서 바로 쓰고 싶다면 이 경로에 추가해야 함 
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:/Users/sanghwa/.nvm/...

 

  • $PWD :  현재 작업 디렉토리" (Print Working Directory)
  • $DISPLAY : X11 기반 GUI 시스템에서, "어느 디스플레이 서버에 GUI를 띄울 것인가?" 를 지정하는 변수
    • :0은 로컬 디스플레이 0번을 의미합니다.
  • $IFS : Internal Field Separator (내부 필드 구분자) Bash 및 POSIX 셸에서 문자열을 단어로 분할할 때 사용하는 기준 문자들입니다 
    • 기본값 : ' \t\n' 공백(space), 탭(tab), 줄바꿈(newline)

위치 변수 셸 스크립트나 함수에 인자를 넘기면, 그 인자들이 $1, $2, ..., $n 등의 형태로 자동으로 저장되는 변수입니다.

 

$ ./greet.sh Alice Bob
스크립트 이름: ./greet.sh
첫 번째 인자: Alice
두 번째 인자: Bob
전체 인자 수: 2
전체 인자 내용: Alice Bob

 

셸 설정 파일 (.zshrc, .bashrc 등)

  • 셸 설정 파일은 셸이 시작될 때 자동으로 실행되는 스크립트 파일로, 주로 환경변수 설정, alias 등록, 도구 초기화 등에 사용
    • .zshrc 실행됨 → export PATH=... 같은 환경변수 선언 명령 자동 수행됨
  • Java나 jar 명령와 같은 외부프로그램의 명령어는 대개 설치할 때 자동으로 시스템 경로($PATH) 에 추가되기 때문에, 터미널 어디에서든 바로 쓸 수 있음
  •   하지만 🔵 nvm, yarn, pyenv, npx, nodenv 같은 셸 기반 도구들은 따로 .zshrc에 수동 설정이 필요

 

쉘 기본명령어

  • VARIABLE_NAME ="value" : Quotes are optional only when the value is plain and safe, like a single word or filename with no spaces.
Quote Types Behavior
"double" Allows variable substitution ($VAR) and command substitution (`pwd`)
'single' Takes everything literally — no $VAR, no command substitution
(none) Risky if value contains spaces or special characters
 
  • $VARIABLE : 특정 변수를 호출
  • $(명령어) : 명령어치환기능으로  어떤 명령어의 실행 결과를 다른 명령어의 인자로 사용하는 기능
    • docker stop $(docker ps -q) : 현재 실행중인 모든 컨테이너 종료
    • is_running=$(lsof -i :$PORT | grep "LISTEN") : lsof -i의 결과값을 is_running에 담음
  • echo "String/Variable" (값 터미널 출력) : Prints the value 
  • set -e :  현재 쉘에서 실행되는 모든 명령어 중 하나라도 실패(exit code ≠ 0)하면 즉시 쉘을 종료시키는 옵션입니다.
  • set +e : -e 설정을 해제합니다. 이후 명령어가 실패해도 스크립트는 계속 진행됩니다
set -e
echo "A"
false
echo "B"  # 실행되지 않음
  • man '명령어': 명령어의 메뉴얼 페이지로 이동해 모든 옵션을 조회합니다. ''로 메뉴얼 페이지에서 나올 수 있습니다.
  • clear: 이전에 입력한 명령어 기록을 삭제합니다.
  • exit: 시스템을 종료합니다.
  • sleep: 지정된 시간 동안 아무 작업도 하지 않는 프로세스를 실행합니다.
  • '테이블/컬럼명 as 별칭': 테이블이나 컬럼명을 지정한 별칭으로 표시합니다.
  • desc '테이블명': 테이블의 모든 컬럼 정보를 표시합니다.
  • date '+%Y-%m-%d %H:%M:%S' : 2025-05-21 21:05:39와 같은 날짜를 생성함.

 

 

프로세스 실행관련

  • nohup : 터미널을 닫아도 프로세스가 계속 실행되게 함 (No Hang Up)
  • & : runs the entire command in the background. So the shell doesn't wait — you get your prompt back immediately.
  • 'process start cmd' > /dev/null 2>&1 (출력결과 무시)
    • > /dev/null : redirect standard output (stdout, file descriptor 1) to /dev/null.
      • /dev/null is a special file that discards everything — a "black hole."
    • redirect standard error (stderr, file descriptor 2) to wherever 1 (stdout) is currently going.
    • At this point, stdout is already redirected to /dev/null, so stderr goes there too.


키워드  

\ :  to accept multiple arguments when break the command across multiple lines 

rsync -av \
  .next \
  public \
  package.json \
  yarn.lock \
  user@host:/path

 

  • exit code : 스크립트 실행되면 자동종료되지만, 명시적으로 명령어의 성공과 실패를 지정할때 "exit code"로 판단함.
    • ?는 exit 코드(종료 상태 코드)를 담고 있는 특수 변수임. 최근실행한 명령어의 성공실패여부확인은 이렇게. echo $?
    • 대부분의 exit코드는 성공하면 0 실패하면 1을 반환한다.
    • exit 1 : terminate process with failure signal

 

 

파일시스템 관리

  • 파일 키워드 :
    • *: 모든 파일이나 디렉토리와 일치합니다.
    • ':' : 디렉토리 간 경로 구분자
    • '~' : 사용자의 홈 디렉토리를 의미합니다.  macOS, Linux의 경우 보통 /Users/사용자이름/
    •  '/' : root
    • '..' 상위디렉토리
    • '.' 현재디렉토리
    • '-' : 이전에 있었던 폴더'
    • .file : 숨김 디렉토리
    • '\' : escape문자로 \다음의 문자가 바로 뒤 문자 하나의 특수 의미를 제거해서, 그냥 문자로써 해석하게 만든다. 하지만 특수 의미란 게 문자마다 다르기 때문에, 결과가 문맥에 따라 달라지는 것처럼 보임
      • $HOME(HOME이라는 변수참조)   \$HOME (문자열 $HOME)
      • "abc" (abc라는 문자열) \"abc\"  ("abc"라는 문자열)
      • * (와일드카드)  \* (별표문자)

 

  • mkdir 'name': 새 디렉토리를 생성합니다.
    • -p 옵션 : 중간 경로가 없어도 자동으로 상위 디렉토리까지 생성해주는 옵션입니다
  • rm [options] [filepath] : remove, 파일이나 디렉토리를 삭제합니다. 리눅스는 휴지통이란 기능이 없기때문에 매우 조심스럽게 사용해야하며, 그러므로 root와 같은 슈퍼관리자로는 작업을 안함. 
    • -r옵션 : recursive, 하위디렉토리를 포함한 모든 파일 삭제 
    •  -f옵션 : force, 강제로 파일이나 디렉토리 삭제 
    • 예: rm -rf 디렉토리명: 현재 directory 내의 directory1 하위의 모든 것 삭
  • cd: change directory, 다른 디렉토리로 이동합니다.
    • 참조방식 : 절대참조 /home/ubuntu/temp.txt, 상대참조 ./temp.txt
  • mv : move directory  파일이나 디렉토리를 이동(move)하거나 이름을 변경(rename)**할 때 사용 
    • 이름변경 : mv old_name.txt new_name.txt
    • 이동 :  mv file1.txt file2.txt file3.txt target_directory/
  • cat '파일명': concatenation, 파일의 내용을 출력합니다.
  • pwd:  print working directory, 현재 디렉토리의 경로를 표시합니다.
  • ls: list, 디렉토리 내용을 나열합니다
    • -a : 숨김파일까지 조회, '.'으로 시작하는 파일은 주로 숨김파일 및 폴더임
    • -l :파일의 정보를 상세하게 확인함 
    •  ls -al의 조회결과
      • 파일 타입: 각 항목의 첫 글자는 파일의 타입을 나타냅니다.
        • d: 디렉토리
        • -: 일반 파일
        • l: 링크 파일(바로가기)
      •  권한: 각 파일의 접근 권한을 나타내며, 세 부분으로 나뉩니다.
        • 생성자 권한 (rwx): 읽기(r), 쓰기(w), 실행(x), r: read, w:write, x:execute
        • 그룹 권한 (rwx): 그룹 사용자의 읽기, 쓰기, 실행 권한
        • 기타 사용자 권한 (rwx): 그룹이나 소유자에 속하지 않는 사용자의 권한
      • 링크 개수: 해당 파일이나 디렉토리가 몇 개의 링크를 가지고 있는지 나타냅니다.
      • 사용자명과 그룹명: 파일이나 디렉토리의 소유자와 그룹을 나타냅니다.
      • 파일 크기: 파일의 크기를 바이트 단위로 표시합니다.
      • 생성일자: 파일이나 디렉토리의 최종 수정 날짜와 시간을 나타냅니다.
      • 파일명: 파일이나 디렉토리의 이름을 표시합니다.
  • head & tail: 파일의 첫 10줄(head)과 마지막 10줄(tail)을 출력합니다.
    • tail -f(follow) : continuously watch logs
  • find [path] [options] [expression] : 지정한 경로에서 주어진 조건에 맞는 파일이나 디렉토리를 찾아내는 데 사용됩니다. 다양한 옵션으로 검색 조건을 세부적으로 설정할 수 있습니다
    • -name: 특정 이름을 가진 파일을 찾습니다.
    • -type: 파일 타입을 기준으로 검색합니다 (예: f는 일반 파일, d는 디렉토리).

 

  • 하드링크&소프트링크

- cp [-rf] [filecopied] [newfile/path]: 파일을 복사함

- ln targetFile fileName (하드링크) : 파일원본과 동일한 자격의 개체가 생겨 원본파일이 삭제되어도 원본 역할을 함. file 하드링크파일 역시 엔트리가 inode를 가리켜서 inode를 가리키는 파일엔트리가 2개가 되는 격.

- ln [-s] targetFile fileName (소프트링크) :   윈도우의 바로가기와 동일한 개념으로 원본파일이 삭제되면 원본파일을 찾을 수 없음. 소프트링크파일 엔트리는 별도의 inode를 만들고 해당 Inode는 원본 파일엔트리를 가리켜서 바로가기 파일과 동일한 역할을 함.

 

파일압축/파일압출해제

  • 파일압축 : tar -czvf archive-name.tar.gz file1 file2 file3 , gzip으로 파일압축
  • 파일압축해제 : tar -xvf file.tar : tar파일 압축해제
  • 여러 옵션들 
    • -c → Create archive, 여러 파일하나로 묶기
    • -x →  Extract(풀기)
    • -z → uncompress, Compress with gzip, gzip으로 압축 및 압축해제
    • -j → uncompress, Compress with bzip2 압축/해제
    • -J → uncompress, Compress with xz 압축/해제
    • -v → Verbose (shows progress)  처리 중 파일 이름 표시
    • -f → 압축시 압축파일 이름 지정/ 압축해제시 압축해제할 파일 이름 지정
    • -C → 특정 디렉토리 기준으로 압축/해제
  • unzip package.zip : zip파일 압축해제


권한관리

  • chmod [숫자] [파일명] : 파일이나 디렉토리의 권한을 변경합니다. 예: chmod 755 파일명
    • 숫자규칙 : 소유자+그룹+기타 순으로 자릿수가 매겨짐
      • r은 4, w는 2.  x는 1이며 이것의 합이 각 주체의 자릿수에 간다
    • chmod -R [숫자] [파일명] : -R옵션은 directory의 모든 파일의 권한을 일괄적으로 바꾼다
  • chown [옵션] [소유자][:그룹] 파일: 리눅스에서 파일이나 디렉토리의 소유자를 변경하는 명령어
    • -R : 디렉토리의 하위 내용 전체에 재귀적으로 적용
sudo chown john:devteam file.txt
  • whoami: 현재 로그인한 사용자 ID를 표시합니다.
    • root는 슈퍼관리자ID이고 모든 권한이 부여되기때문에 파일을 삭제시 복구가 어려우므로 root라는 사용자는 잘사용하지 않는다. 대신, 슈퍼관리자권한이 필요할때 sudo 명령어를 사용한다.
  • sudo: 관리자 권한으로 명령을 실행합니다. 예: sudo apt-get update
    • 일부 애플리케이션은 Unix Socket 인증인 sudo를 통해 자동 인증하여 root 계정을 사용하도록 설정됨.  Unix 소켓(Unix Domain Socket, UDS)을 사용하여 운영체제의 사용자 계정과 애플리케이션 계정을 연결하는 인증 방식. 
      • unix 소켓이란 : 운영체제(로컬) 내에서 파일시스템을 통해서 송수신이 실행되는 프로세스 간 통신(IPC, Inter-Process Communication)을 위한 소켓
    • 즉,운영체제의 사용자 계정을 확인하여 로그인 권한을 부여하는 방식. 현재 리눅스 사용자가 root라면, MariaDB에서도 root로 로그인할 수 있도록 자동 인증해주는 거야.
    • 따라서, sudo mysql -u root 또는 mysql -u root만 입력하면 자동으로 로그인됨.
    • apt-get update는 시스템업데이트로 관리자권한이 필요한데 sudo로 실행시켜야만 실행가능


VI에디터

윈도우에서 작성한 파일과 리눅스에서 작성한 스크립트가 호환성이 다르기때문에 vi에서 작성하는 것을 권장함

  • vi 'filename': vi 에디터로 파일을 열거나 새 파일을 생성합니다.
  • dd : 기존 내용지우기
  • i 혹은 insert key : 입력모드로 전환
  • esc : 입력완료 후 입력모드 종료
  • :w 저장
  • :q 종료
  • :wq 저장 후 종료
  • /word 아래방향으로 'word검색
  • :set ff : show file format
    • :set ff=unix / dos로 되어있다면 unix로 변경필요

 

프로세스 관리

  • 포그라운드 프로세스 : 쉘에서  해당 명령을 실행한 후, 해당 프로세스 수행 종료까지 사용자가 다른 입력을 하지 못하게하는 프로세스. 특별한 커맨드를 넣지 않으면 기본으로 포그라운드 프로세스로 실행된다. 
    • ctrl+c : 포그라운드 프로세스 취소
  • 백그라운드 프로세스 : 사용자 입력과 관계없이 실행되는 프로세스로 맨뒤에 &를 붙여줌. 특히, 시간이 오래걸리는 작업에 많이 사용됨. [작업번호] processID로 표기된다.
  • - jobs : shell 에서 실행되고 있는 명령어 중 백그라운드 프로세스의 작업에 대한 정보를 확인
  • - fg %number : job number을 백그라운드 프로세스를 포그라운드로 변경함
  • ps [option] : process status의 약자이며, 현재 실행 중인 프로세스 목록을 출력하는 명령어입니다. 기본적으로는 자기 계정이 실행한 프로세스만 보여줍니다.
    • 옵션
      • -e  : everyone, 모든 사용자의 모든 프로세스 출력
      • -f  : full, 전체 형식으로 출력 (PPID, UID, CMD 등 포함)
      • -a : all  터미널에 연결된 모든 사용자의 프로세스 출력 (단, 세션 리더 제외)
      • -u : user 프로세스를 소유한 사용자 정보도 함께 출력
      • -x : x-include, TTY (터미널 디바이스)에 연결되지 않은 프로세스로 백그라운드 데몬이나 GUI 환경에서 실행하는 것
      • -l : long 상세 포맷으로 출력 (flag, priority, nice 등) 
  • 터미널 : 사용자가 문자로 OS와 상호작용하는 인터페이스. 셸(Shell)은 운영체제와 통신하는 프로그램이고, 터미널(Terminal)은 그 셸과 사용자 사이의 입출력 인터페이스
    • TTY :  ps에서 프로세스가 연결된 터미널을 나타내는 컬럼
    • pts/N : 가상 터미널 (SSH, GUI 등)
    • ttyN : 물리 콘솔
    • ? : 터미널 없는 프로세스 (데몬, GUI 앱 등)
  •  

  자주쓰이는 조합

  • ps -ef : 모든 프로세스를 full format으로 출력
UID       PID  PPID  C STIME TTY          TIME CMD
root        1     0  0 Jun01 ?        00:00:01 /sbin/init
ubuntu   2345  2344  0 14:03 pts/0    00:00:00 bash
ubuntu   2367  2345  0 14:04 pts/0    00:00:00 vim
컬럼명  의미  예시  설명
UID 프로세스 소유자 root, ubuntu 누가 이 프로세스를 실행했는가
PID 프로세스 ID 2345 유일한 식별 번호
PPID 부모 프로세스 ID 2344 이 프로세스를 실행한 상위 프로세스
C CPU 사용률 0 CPU 사용량 (percent)
STIME 시작 시간 14:03 프로세스가 시작된 시간
TTY 터미널 (입출력) pts/0, ?, tty1 이 프로세스가 연결된 터미널
TIME 누적 CPU 시간 00:00:00 이 프로세스가 사용한 총 CPU 시간
CMD 실행 명령어 bash, vim 실제 실행된 명령어 또는 경로

 

  • ps -aux : 터미널 유무 상관없이 모든 프로세스 출력, 사용자 중심 정보 포함
    • 정보 : (stat : running,stop, idle(커널용 쓰레드) time : cpu 사용시간 ; command : 프로세스실행명령 등
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 169084  1188 ?        Ss   Jun01   0:01 /sbin/init
ubuntu    2345  0.0  0.2  60500  2344 pts/0    Ss   14:03   0:00 -bash
ubuntu    2367  0.0  0.3  78520  3456 pts/0    S+   14:04   0:00 vim test.txt
root      2784  0.1  1.0 123456 12345 ?        Sl   14:05   0:03 /usr/bin/python3 app.py
컬럼  예시 값  설명
USER root, ubuntu 프로세스를 실행한 사용자
PID 2345 프로세스 ID (kill 할 때 사용)
%CPU 0.0 CPU 사용률 (%)
%MEM 0.2 메모리 사용률 (%)
VSZ 60500 가상 메모리 사용량 (KB 단위)
RSS 2344 실제 메모리 사용량 (KB 단위, Resident Set Size)
TTY pts/0, ? 연결된 터미널 (없으면 ?)
STAT Ss, S+, Sl 프로세스 상태 (아래 설명 참고)
START 14:03 시작 시간
TIME 0:00 누적 CPU 사용 시간
COMMAND /bin/bash, vim 실행된 명령어 전체 경로

 

STAT 코드 프로세스 상태 의미
S Sleep (자고 있음, 대기 상태)
R Running (실행 중)
Z Zombie (좀비 프로세스)
T Traced/Stopped (중지됨)
D Disk sleep (I/O 대기 중)
+ foreground group에 속함
l, s, L, N 등 기타 부가 정보

 

  • kill [-9(option : 무조건)] [%작업번호 or PID] : 프로세스 종료시키는 명령어. 
  • $! : 가장 최근에 백그라운드로 실행된 프로세스의 PID

 

AI영상관련 명령어

  • nvidia-smi :  GPU 드라이버(NVIDIA Driver) 설치확인. GPU 상태 모니터링 도구로, GPU 사용량, 메모리 사용량, 프로세스 정보, 드라이버 버전 확인. + 지원가능한 CUDA버전 
  • nvcc --version : GPU 연산을 직접 프로그래밍할 때 사용하는 개발 툴킷
  • top : 리눅스에서 실시간으로 시스템 리소스 사용 현황을 보여줌
    • CPU 사용 상태 (us: 사용자, sy: 시스템, id: 유휴 등)
    • MiB Mem : 전체 메모리, 사용 중, 여유, 캐시 등
    • MiB Swap : 스왑 메모리 사용 현황
    • load average : 시스템 부하 평균 (1, 5, 15분), 리눅스에서 **CPU가 처리해야 하는 작업의 평균 대기 수(로드)**를 나타내는 지표입니다. 이 수치가 높을수록 CPU가 바쁘거나 병목이 생기고 있다는 뜻입니다

 

 

What is a Shell Script?

A shell script is a text file containing a sequence of commands for a Unix-based operating system's shell to execute.

 

  • #!/bin/sh(스크립트시작) : execute this script using /bin/sh (a shell interpreter).”
    • #! : special character sequence that tells the system this is a script.
    • /bin/sh → the interpreter to use (in this case, the sh shell).
#!/bin/bash
echo "Hello, world!"
mkdir my_folder
cd my_folder
touch file.txt

 

 

쉘 스크립트 

  • file containing a series of commands, just like a script in a play or a program

 

쉘 스크립트 해석

  • 스크립트 해석순서
    • Basically Shell parses from left to right
    • Variable assignments are evaluated before the command runs
    • Pipes (|), redirects (>, <), logical operators (&&, ||) are parsed based on shell grammar and grouping

 

쉘 스크립트 구성요소

 

 

 

스트림 제어(Stream Control)

 

기본 스트림

이름 번호 설명 기본 흐름
stdin 0 표준 입력 키보드 입력 → 명령어
stdout 1 표준 출력 명령어 출력 → 화면
stderr 2 표준 에러 출력 에러 메시지 → 화면 (보통 빨간 글씨)
  • 하나의 프로세스는 반드시 stdin stdout stderr 3가지 스트림(경로)를 갖고 있음. 이는 프로그램으로의 input과 output, error 메세지의 이동경로를 말하며 stdout과 stderr은 기본적으로 콘솔출력창으로 향함

 

리다이렉션과 파이프

  • > : 명령어 표준 출력을 콘솔창이 아닌 파일에 작성할때 사용함. 파일이 존재하지않으면 파일을 생성함
    • echo hello > out.txt : out.txt 파일에 "hello" 저장
  • >> : 표준 출력을 파일에 내용 추가. 덮어쓰고싶지 않을때 사용.
    • echo world >> out.txt : out.txt 끝에 "world" 추가
  • < : 반대로 파일의 내용물을 프로그램의 입력으로 사용
    • head < file.txt : file.txt 내용을 읽어서 head 명령어에 입력
  • <<  here document  :여러 줄 문자열을 명령어의 표준 입력(stdin) 으로 전달할 때 사용 것" 마커는 명령어의 시작과 끝을 구분하는 고유한 문자열입니다
ssh $REMOTE_USER@$REMOTE_HOST << EOF
  cd $REMOTE_PATH
  yarn install
  yarn build
EOF

 

  • 파이프(|) : 파이프 앞의 프로세스의 출력이 그 다음 프로세스의 입력으로 사용.
    • ls | grep ab : ab를 포함한 스트림만 출력, 폴더 내의 파일을 찾을 때 유용함
  • 2> : 에러(stderr)를 파일로 저장
    • command 2> err.log : 에러 로그만 err.log에 저장
  • fd(2)>&fd(1) : 파일디스크립터 간에 내용을 리다이렉션처리함. 예제에서는  에러(stderr)를 표준 출력(stdout)과 같은 곳으로 보냄
    • command > all.log 2>&1 : 출력 + 에러 모두 all.log에 저장

 

  • grep [-option] patternToSearch [directory]  : global regular expression print, 파일이나 입력 스트림에서 특정 패턴과 일치하는 라인을 찾아 출력합니다. 다양한 옵션을 사용할 수 있습니다:
    • -i (ignore case): 대소문자를 구분하지 않고 검색합니다.
    • -v (invert match): 지정한 패턴을 포함하지 않는 라인을 출력합니다.
    • -n (line number): 검색 결과에 라인 번호를 추가합니다.
    • -l (list): 패턴과 일치하는 파일명만 출력합니다.
    • -c (count): 패턴과 일치하는 라인의 수만 출력합니다.
    • -r (recursive): 하위 디렉토리까지 검색합니다.

grep으로 특정 문자열을 포함하는 파일 목록만 찾기

grep -rl "찾을문자열" 경로/

 

 

 

 

  • awk '조건 {동작}'  input : awk는 자체 문법과 실행 규칙을 가진 미니 프로그래밍 언어. 줄(line) 단위로 입력을 읽고,
    각 줄을 공백 기준 필드(column) 로 나눈 뒤, 지정된 패턴과 동작을 수행하는 텍스트 처리 미니 언어입니다. 
    • 조건: 줄 필터 (생략하면 모든 줄)
    • 동작: 예를 들어 print, sum +=, if (...), 등
      • print $1 : 첫 번째 필드 출력
    • 입력: 파일 or 표준 입력 (파이프 가능)
  • xargs : 앞에서 받은 문자열들을 뒤에 붙는 명령어의 인자로 전달하는 도구예요.
    • PID 목록을 받아서 kill 명령에 넘기는 것
    • xargs 없이 kill 쓰면 PID 목록에는 오동작/파이프 처리 불가 문제 발생할 수 있음
ps -ef | grep '[j]ava' | awk '{print $2}' | xargs kill

 

쉘 스크립트 자바로 생성

일반적으로 CLI에서는 bash shell에 들어가 있기때문에 쉘 문법을 사용해도 자동적으로 parsing을 통해서 해석을 해준다.

그러나 java에서는 shell을 거치지 않고 process를 바로 생성하는 방식이므로, 아래와 같은 복잡도가 있는 shell을 생성하기 위해서는 shell을 직접적으로 호출해야한다.

 

Shell 호출

  • /bin/sh "echo Hello World" : 'echo Hello World'라는 이름의 쉘 스크립트 파일을 실행함
  • /bin/sh -c  "ech Hello World" : 'echo Hello World'를 커맨드로 이해하고 커맨드를 실행한다. 


Java Process Object

  • Process is an object that represents an OS-level process started by your Java code. 
process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd.toString()});
  • Process create : Runtime.getRuntime().exec()
Method Accepts Use case
exec(String) One string Simple commands (no shell logic)
exec(String[]) String array (command + args) Commands with args or shell logic

 

  • Process object Control
Method Purpose
process.getInputStream() Read the process's standard output (stdout)
process.getErrorStream() Read the process's error output (stderr)
process.getOutputStream() Write to the process's input (stdin)
process.waitFor() Wait for the process to finish
process.exitValue() Get the process's exit code
process.destroy() Kill (terminate) the process

 

 

SSH (Secure Shell) 개념과 설정 방법

  • SSH (Secure Shell)는 원격 서버에 인터넷을 통해 암호화하여 접속할 수 있도록 하는 네트워크 프로토콜 및 프로그램. 보통 SSH 포트(22번)는 방화벽이나 서버에서 예외 처리되어 있음.  

 

SSH의 주요 기능

  • 원격 서버 로그인 (ssh user@server-ip)
  • 원격 명령 실행 (ssh user@server-ip "command")
  • 파일 전송 (scp, rsync)
  • 포트 포워딩 (터널링, X11 Forwarding)
    • SSH 연결을 중개 채널(터널) 삼아서, 로컬과 원격 포트 간의 통신을 안전하게 이어주는 기술.
    • 내 컴퓨터에서 특정 포트로 접속하면, 원격 서버의 특정 포트로 연결되도록 만들어줌 (ex: DB 접근, 웹서버 포트 우회 등).

 

사용케이스회사

  • 보안적으로 더 안전한 연결 : 모든 트래픽은 SSH를 통해 암호화됨. 평문으로 통신하지 않아 중간에 감청될 걱정 없음
    • DB 서버의 3306 포트에 직접 접근하면, 비밀번호 등 민감한 데이터가 평문 전송될 수 있음. 네트워크 상에서 중간자(MITM) 공격 가능. 사설망 또는 방화벽 없으면 누구나 접근 가능
  • 방화벽 때문에 직접 접근이 안 될 때 : 회사 내부 DB 서버는 외부에서 직접 접근이 차단됨 하지만 SSH는 열려 있음.  ssh로 우회하여 DB서버에 접근 

 

원격 서버 로그인

  • SSH 접속 방법 :  개발 서버의 원격 터미널 (리눅스 쉘 등)에 직접 접속해서 CLI 사용. 인증방식은 서버 계정 비밀번호 사용
    • -i [filepath] :  키 파일로 로그인 (예: pem 파일), specifies the path to the file that contains the private key 
    • -p [portNum] : 기본 SSH 포트는 22번이지만, 서버에서 다른 포트를 사용한다면 -p 옵션 추가
ssh user@server-ip
ssh -i /경로/개인키.pem ubuntu@123.456.78.90

 

명령어 정리

  • ssh user@hostname : 원격 서버에 연결하여 그 사용자의 로그인 셸(login shell)을 실행하는 명령  
  • ssh -i /path/to/private_key user@hostname : 개인 키를 사용해 비밀번호 없이 연결.
  • ssh -p 2222 user@hostname : 포트 지정. 기본 SSH 포트(22)가 아닌 사용자 지정 포트로 연결.
  • ssh user@hostname "ls -l /var/www" : SSH 연결 후 원격 서버에서 특정 명령어 실행.
  • ssh -A user@hostname : SSH Agent Forwarding을 활성화하여, 현재 SSH 세션에서 개인 키 인증을 다른 서버로 전달.
  • ssh -L 8080:localhost:80 user@hostname :  포트포워딩. 내 로컬 머신의 8080 포트로 접속하면, 원격 서버의 80 포트로 전달.
  • ssh -R 8080:localhost:80 user@hostname : 포트포워딩. 원격 서버의 8080 포트로 접속하면, 내 로컬 머신의 80 포트로 전달.
  • ssh -f -N user@hostname  : SSH 연결은 유지하되, 명령어 실행 없이 백그라운드에서 실행.
  • ssh host << EOF {script} EOF : here document 방식으로 복수의 명령어를 한번에 송출

 

SSH 인증방식

  SSH는 기본값으로 비밀번호를 통해서 인증하도록 하나, 원격서버 컨트롤 스크립트나 CI/CD 자동화같은 행위를 할때 원격서버의 비밀번호를 스크립트 내에 포함하기 보다는 공개키 인증방식을 통해서 비밀번호 없이 

인증 방식 설명 보안 수준 자동화 적합성
🔑 공개키 인증 로컬의 개인키(Private Key)와 서버의 공개키(Public Key) 쌍을 사용해서
비밀번호 없이 접속
매우 높음 ✅ 매우 적합
🔐 비밀번호 인증 접속 시마다 비밀번호를 직접 입력해야 함 중간 ❌ 자동화 불리함

 

ssh-keygen

ssh-keygen은 로컬에서 개인키/공개키를 생성하는 명령어입니다.

ssh-keygen -t rsa -b 4096 -C "설명용 이메일"
  • -t rsa : 키 타입(type)을 지정합니다. 여기서는 RSA 알고리즘 사용을 의미합니다.
  • -b 4096 : 비트 수(보안 수준)을 지정합니다.
  • -C "..." : 생성하는 키에 주석(comment)을 추가합니다. 보통 이메일이나 설명을 넣습니다

명령을 실행하면 다음 두 개의 파일이 생성됩니다:.

  • id_rsa = 개인키 (절대 노출 금지)
  • id_rsa.pub = 공개키 (서버에 등록할 키) .서버의 ~/.ssh/authorized_keys에 등록하여 접속 허용에 사용됩니다.

 

ssh-copy-id

ssh-copy-id user@host
  • 내부적으로 id_rsa.pub를 서버의 ~/.ssh/authorized_keys에 추가해줍니다.


파일 전송
 (scp, rsync)

SSH는 SCP(Secure Copy Protocol) rsync(remote sync)를 통해 안전한 파일 전송을 지원

 

scp

  • scp /path/to/local_file user@hostname:/path/to/remote_directory :  로컬에서 원격 서버로 파일 전송
  • scp user@hostname:/path/to/remote_file /path/to/local_directory : 원격서버에서 로컬로 파일 다운로 
  • scp -r /path/to/local_directory user@hostname:/path/to/remote_directory : 디렉토리를 재귀적으로 전송
scp [옵션] <로컬_파일_경로> <사용자>@<원격_주소>:<목적지_경로>

 

rsync

rsync [options] source target
  • source and target : Can be local → remote, remote → local, or local → local
  • -a: archive mode (preserves permissions, timestamps, recursive, etc.)
  • -v: verbose (shows what’s happening)
  • -e: toSpecify which program to use to remotely execute commands. In practice, this is used to customize the SSH command
  • --delete : Deletes files on the remote that no longer exist locally.
rsync -av -e "ssh [ssh-options]" --delete local-path user@remote-host:remote-path

네트워크 관리 : 기타

  • ifconfig: 네트워크 인터페이스와 IP 정보를 확인합니다.
  • curl : HTTP, HTTPS, FTP 등 여러 프로토콜을 사용해 서버에 요청(Request) 을 보내고, 그 응답(Response) 을 받아오는 도구
    • curl은 기본적으로 받은 데이터를 터미널(stdout) 에 출력합니다
curl https://example.com
curl -H "Authorization: Bearer token" https://api.example.com/data
  • -H : API에 인증 헤더를 붙여 요청을 보냅니다.
curl -o myfile.sh https://example.com/install.sh
  • curl -o filename <url> : 받은 데이터를 지정한 파일에 저장 
curl -o - https://example.com/script.sh | bash
  • curl -o- url : 받은 데이터를  명확히 stdout으로 넘긴다는 걸 표현함.

 

'개발기술 > 빌드, 배포, 운영' 카테고리의 다른 글

로그  (0) 2025.05.09
원격제어 ; GUI 제어  (0) 2025.03.13
Jenkins CI/CD 자동화  (0) 2025.01.26
빌드와 Gradle 개념, Gradle 빌드 사용법  (0) 2024.11.12
빌드 후 서버 배포  (1) 2024.11.12