본문 바로가기
MLOps

MLOps - 9. Linux & Shell Command

by cocacola0 2022. 5. 24.

출처 : 변성윤님 블로그.
출처 : 부스트캠프 AI Tech.

1.Linux

1.1 Linux를 알아야 하는 이유

  • 서버에서 자주 사용하는 OS
  • Mac, Window도 서버로 활용은 가능하나 유료
  • Free, 오픈소스
  • 여러 버전이 존재 => 여러분들의 버전을 만들 수도 있음
  • 안정성, 신뢰성. 유닉스라 Stability, Reliability
  • 쉘 커맨드, 쉘 스크립트

1.2 CLI, GUI

  • CLI : Terminal
    • Command Line Interface
  • GUI : Desktop
    • Graphic User Interface

1.3 대표적인 Linux 배포판

  • Debian
    • 온라인 커뮤니티에서 제작해 배포
  • Ubuntu
    • 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치 - 초보자들이 쉽게 접근할 수 있도록 만듬
  • Redhat
    • 레드햇이라는 회사에서 배포한 리눅스
  • CentOS
    • Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전

1.4 Linux, Shell Script 학습 가이드

  • 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
  • 필요한 코드가 있는 경우 검색해서 찾기
  • 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
  • 왜 이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습(아마도 커널)
  • VirtualBox에 Linux 설치, Docker로 설치
  • WSL 사용(윈도우)
  • Notebook에서 터미널 실행
  • 2.4 Cloud에서 띄우는 인스턴스에서 연습

2. Shell Commmand

2.1 쉘의 종류

    • 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
  • 터미널/콘솔
    • 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달
    • 프로그램의 출력을 화면에 작성
  • sh
    • 최초의 쉘
  • bash
    • Linux 표준 쉘
  • zsh
    • Mac 카탈리나 OS 기본 쉘

2.2 쉘 UX

  • username@hostname:current_folder
  • hostname : 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장

2.3 쉘을 사용하는 경우

  • 서버에서 접속해서 사용하는 경우
  • crontab 등 Linux의 내장 기능을 활용하는 경우
  • 데이터 전처리를 하기 위해 쉘 커맨드를 사용
  • Docker를 사용하는 경우
  • 수백대의 서버를 관리할 경우
  • Jupyter Notebook의 Cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
  • 터미널에서 python3, jupyter notebook 도 쉘 커맨드
  • Test Code 실행
  • 배포 파이프라인 실행(Github Action 등에서 실행)

2.4 기본 쉘 커맨드

# 1. man
# 쉘 커맨드의 매뉴얼 문서를 보고 싶은 경우
# 종료 : `q` 입력
$ man python


# 2. mkdir
# 폴더 생성하기
$ mkdir linux-test


# 3. ls
# 현재 접근한 폴더의 폴더, 파일 확인 : List Segments
# ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 실행 
# 폴더를 작성하면 폴더 기준에서 실행
# 옵션
# -a : .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력
# -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력
# -h : 용량을 사람이 읽기 쉽도록 GB, MB 등 표현. `-l`과 같이 사용
$ ls ~ ls
$ ls -al
$ ls -lh


# 4. pwd
# 현재 폴더 경로를 절대 경로로 보여줌
$ pwd


# 5. cd
# 폴더 변경하기, 폴더로 이동하기
$ cd linux-test


# 6. echo
# Python의 print처럼 터미널에 텍스트 출력
$ echo "hello"
"hello"
# echo `쉘 커맨드` 입력시 쉘 커맨드의 결과를 출력. ` : 1 왼쪽에 있는 backtick
$ echo `pwd`
/Users/philhoonoh/Desktop/product_serving/


# 7. vi
# vim 편집기로 파일 생성
# - INSERT 모드에서만 수정할 수 있음
$ vi vi-test.sh
# (새로운 창이 뜨면) i 를 눌러서 INSERT 모드로 변경 그 후 echo “hi” 작성
# ESC를 누른 후 :wq (저장하고 나가기, write and quit) ESC :wq! : 강제로 저장하고 나오기
# ESC :q : 그냥 나가기
# vi 편집기의 Mode - Command Mode, Insert Mode, Last Line Mode

# 7-1. vi Command Mode
# vi 실행시 기본 Mode
# dd : 현재 위치한 한 줄 삭제
# i : INSERT 모드로 변경
# x : 커서가 위치한 곳의 글자 1개 삭제(5x : 문자 5개 삭제) yy : 현재 줄을 복사(1줄을 ctrl + c)
# p : 현재 커서가 있는 줄 바로 아래에 붙여넣기
# k : 커서 위로
# j : 커서 아래로
# l : 커서 오른쪽으로
# h : 커서 왼쪽으로

# 7-2. vi Insert Mode
# 파일을 수정할 수 있는 Mode
# 만약 Command Mode로 다시 이동하고 싶다면 ESC 입력

# 7-3. vi Last Line Mode
# ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
# w : 현재 파일명으로 저장
# q : vi 종료(저장되지 않음)
# q! : vi 강제 종료(!는 강제를 의미) 
# wq : 저장한 후 종료
# /문자 : 문자 탐색
- 탐색한 후 n을 누르면 계속 탐색 실행 
# set nu : vi 라인 번호 출력


# 8. bash
# bash로 쉘 스크립트 실행 
$ bash vi-test.sh
# 앞에서 작성한 “hi”가 출력
# 터미널에서 Tab을 누르면 자동완성(지원하지 않는 쉘도 존재)


# 9. sudo
# 관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo를 붙임
# sudo 명령어 : 최고 권한을 가진 슈퍼 유저로 프로그램을 실행
# “superuser do”에서 유래하고, 최근엔 “substitute user do”(다른 사용자의 권한으로 실행)의 줄임말로 해석


# 10. cp
# 파일 또는 폴더 복사하기 : Copy
$ cp vi-test.sh vi-test2.sh
# -r : 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 recursive(재귀적)으로 모두 복사 
# -f : 복사할 때 강제로 실행


# 11. mv
# 파일, 폴더 이동하기(또는 이름 바꿀 때도 활용) : Move
# mv vi-test.sh vi-test3.sh


# 12. cat
# 특정 파일 내용 출력 : concatenate
$ cat vi-test.sh
# 여러 파일을 인자로 주면 합쳐서(CONCAT) 출력 
$ cat vi-test2.sh vi-test3.sh
# 파일에 저장하고(OVERWRITE) 싶은 경우 
$ cat vi-test2.sh vi-test3.sh > new_test.sh
# 파일에 추가(APPEND) 싶은 경우
$ cat vi-test2.sh vi-test3.sh >> new_test.sh


# 13. clear
# 터미널 창을 깨끗하게 해줌


# 14. history
# 최근에 입력한 쉘 커맨드 History 출력
# History 결과에서 느낌표를 붙이고 숫자 입력시 그 커맨드를 다시 활용할 수 있음
# !13 -> 13번째 command 다신 실행 


# 15. find
# 파일 및 디렉토리를 검색할 때 사용
$ find . -name “File” 
# 현재 폴더에서 File이란 이름을 가지는 파일 및 디렉토리 검색


# 16. export
# export로 환경 변수 설정 
$ export water="물"
$ echo $water
$ echo water
# export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨
# 매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
# (Linux) vi ~/.bashrc 또는 vi ~/.zshrc (자신이 사용하는 쉘에 따라 다름)
# 제일 하단에 export water=”물"을 저장하고 나옴(ESC :wq)
# 그 후 source ~/.bashrc 또는 source ~/.zshrc
# Linux 환경 설정을 재로그인하지 않고 즉시 적용하고 싶은 경우 source 사용


# 17. alias
# 터미널에서 alias라고 치면 현재 별칭으로 설정된 것을 볼 수 있음 
# alias는 기본 명령어를 간단히 줄일 수 있는 것
# 예) ll는 ls -l로 별칭이 지정되어 있음
$ alias ll2=’ls -l’
# ll2를 입력하면 ls -l이 동작됨

2.5 표준 스트림(Stream)

  • Unix에서 동작하는 프로그램은 커맨드 실행시 3개의 Stream이 생성
  • stdin : 0으로 표현, 입력(비밀번호, 커맨드 등)
  • stdout : 1로 표현, 출력 값(터미널에 나오는 값)
  • stderr : 2로 표현, 디버깅 정보나 에러 출력

2.5 쉘 커맨드

# 1. head, tail
# 파일의 앞/뒤 n행 출력 
$ head -n 3 vi-test.sh


# 2. sort
# 행 단위 정렬
# -r : 정렬을 내림차순으로 정렬(Default 옵션 : 오름차순) 
# -n : Numeric Sort
$ vi fruits.txt
banana 
orange 
apple 
apple 
orange 
orange 
apple 
banana
# ESC :wq로 저장
$ cat fruits.txt | sort 
$ cat fruits.txt | sort -r


# 3. uniq
# 중복된 행이 연속으로 있는 경우 중복 제거
# sort와 함께 사용
# -c : 중복 행의 개수 출력
$ cat fruits.txt | uniq
$ cat fruits.txt | sort | uniq
$ cat fruits.txt | uniq | wc -l
# wc -l : line count 갯수 출력 
$ cat fruits.txt | sort | uniq | wc -l


# 4. grep
# 파일에 주어진 패턴 목록과 매칭되는 라인 검색
# grep 옵션 패턴 파일명
# 옵션
# -i : Insensitively하게, 대소문자 구분 없이 찾기 
# -w : 정확히 그 단어만 찾기
# -v: 특정 패턴 제외한 결과 출력
# -E : 정규 표현식 사용
# 정규 표현식 패턴
# ^단어 : 단어로 시작하는 것 찾기 
# 단어$ : 단어로 끝나는 것 찾기
# . : 하나의 문자 매칭
# grep [options] [pattern] [file]
# grep -i "emoticon" kakaotalk.csv


# 5. cut 
# 파일에서 특정 필드 추출
# -f : 잘라낼 필드 지정
# -d : 필드를 구분하는 구분자. Default는 \t
$ vi cut_file
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ESC :wq
$ cat cut_file | cut -d : -f 1,7
# 1번째, 7번째 값을 가져옴


# 6. Redirection & Pipe
# Redirection : 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
# > : 덮어쓰기(Overwrite) 파일이 없으면 생성하고 저장
# >> : 맨 아래에 추가하기(Append) 
$ echo “hi” > vi-test3.sh
$ echo “hello” >> vi-test3.sh 
$ cat vi-test3.sh

# Pipe : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우 
# A의 Output을 B의 Input으로 사용(다양한 커맨드를 조합)
# 현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우
$ ls | grep “vi”
# grep “vi” : 특정 단어 찾기
$ ls | grep “vi”
# 위 결과를 다시 output.txt에 저장하고 싶은 경우 
$ ls | grep “vi” > output.txt
# 최근 입력한 커맨드 중 echo가 들어간 명령어를 찾고 싶은 경우 
$ history | grep “echo”

# <연습문제>
# 1. test.txt 파일에 "Hi!!!!"를 입력해 주세요 (vi 사용 금지)
$ echo "Hi\!\!\!\!\!s" > test.txt
# 2. test.txt 파일 맨 아래에 "kkkkk"를 입력해 주세요 (vi 사용 금지)
# echo "kkkkk" >> test.txt
# 3. test.txt 라인 수를 구해주세요 (힌트 : wc -l를 쓰면 라인 수를 구할 수 있음)
# cat test.txt | wc -l 

2.6 서버 쉘 커맨드

# 1. ps
# 현재 실행되고 있는 프로세스 출력하기 : Process Status
# -e : 모든 프로세스
# -f : Full Format으로 자세히 보여줌


# 2. curl
# Command Line 기반의 Data Transfer 커맨드 : Client URL
# Request를 테스트할 수 있는 명령어
# 웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음 
$ curl -X localhost:5000/{data}
# curl 외에 httpie 등도 있음(더 가독성있게 출력)


# 3. df
# 현재 사용 중인 디스크 용량 확인 : Disk Free 
# -h : 사람이 읽기 쉬운 형태로 출력


# 4. scp 
# SSH을 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어 : Secure Copy(Remotefile copy program)
# -r : 재귀적으로 복사
# -P : ssh 포트 지정
# -i : SSH 설정을 활용해 실행
# local => remote
$ scp local_path user@ip:remote_directory
# remote => local
$ scp user@ip:remote_directory local_path
# remote => remote
$ scp user@ip:remote_directory user2@ip2:target_remote_directory


# 5. nohup
# 터미널 종료 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)
$ nohup python3 app.py &  
# nohup으로 실행될 파일은 Permission이 755여야 함
# 종료는 ps ef | grep app.py 한 후, 
# pid(Process ID) 찾은 후 kill -9 pid 로 프로세스를 Kill 
# 로그는 nohup.out에 저장됨
# nohup 외에도 screen이란 도구도 있음


# 6. chmod
# 파일의 권한을 변경하는 경우 사용 : Change Mode 
# 유닉스에서 파일이나 디렉토리의 시스템 모드를 변경함 
# ls -al(혹은 ll)을 입력하면 다음과 같이 나옴
drwxr-xr-x  14 philhoonoh  staff    448 May 19 12:18 .git
drwxr-xr-x   3 philhoonoh  staff     96 May 17 13:02 .github
drwxr-xr-x   9 philhoonoh  staff    288 May 19 12:57 .idea
# User(소유자)/Group/모든 사용자 순으로 권한 
# Permission
# r = Read(읽기), 4
# w = Write(쓰기), 2
# x = eXecute(실행하기), 1
# - = Denied
# r-x : 읽거나 실행할 수는 있지만 수정은 불가능
# 755, 644로 퍼미션을 주세요! 라고 하는 경우가 존재
# rwx를 더하면 4+2+1 = 7
$ chmod 755 vi-test2.sh 
# 실행하면 파일의 Permission이 변경됨

2.7 Shell Script

  • .sh 파일을 생성하고, 그 안에 쉘 커맨드를 추가
  • 파이썬처럼 if, while, case 문이 존재하며 작성시 bash name.sh로 실행 가능
  • 쉘 스크립트 = 쉘 커맨드의 조합
  • 쉘 커맨드에 익숙해진 후, 스크립트로 생성(Python과 유사)
  • 지금은 쉘 커맨드에 많이 익숙해진 후, 추후에 하나씩 만들어보기(쉘 커맨드가 항상 베이스)
  • https://github.com/zzsza/shell-scripts
  • https://github.com/denysdovhan/bash-handbook
  • https://github.com/epety/100-shell-script-examples
  • #!/bin/bash : Shebang
    • 이 스크립트를 Bash 쉘로 해석
  • $(date +%s) : date를 %s(unix timestamp)로 변형 START=$(date +%s) : 변수 저장
#!/bin/bash
START=$(date+%s)

echo "Calculate run-time"

sleep 3
END=$(date+%s)
DIFF_SECOND=$(($END-$START))
DIFF_MINUTE=$(($DIFF_SECOND/60))

echo ${DIFF_SECOND}

2.8 Special Mission

  • 카카오톡 그룹 채팅방에서 옵션 - 대화 내보내기로 csv로 저장 후, 쉘 커맨드 1줄로 카카오톡 대화방에서 2021년에 제일 메세지를 많이 보낸 TOP 3명 추출하기!
    $ head -n 5 kakaotalk.csv
    Date,User,Message
    2022-01-21 17:39:32,"카페1234","카페1234 joined this chatroom.
    You may temporarily be banned from using KakaoTalk if other members report you for violating our Operation Policy."
    2022-01-21 17:39:44,"감자단장","여기에서 뒤에 딱지를 붙이는건 트랙을 분리하려는거고 톡방을 따로 만드는건 관심있는 대화주제를 이야기할 수 있단 장점이 있는거라고 생각되요"
    2022-01-21 17:40:05,"반가운 무지","이거에 대해서 말하는겁니다..."
    $ cat kakaotalk.csv | cut -d , -f 1,3 | head -n 5 
    Date,Message
    2022-01-21 17:39:32,"카페1234 joined this chatroom.
    You may temporarily be banned from using KakaoTalk if other members report you for violating our Operation Policy."
    2022-01-21 17:39:44,"여기에서 뒤에 딱지를 붙이는건 트랙을 분리하려는거고 톡방을 따로 만드는건 관심있는 대화주제를 이야기할 수 있단 장점이 있는거라고 생각되요"
    2022-01-21 17:40:05,"이거에 대해서 말하는겁니다..."
    $ cat kakaotalk.csv | cut -d , -f 1,3 | grep --line-buffered "2022" | head -n 5 
    2022-01-21 17:39:32,"카페1234 joined this chatroom.
    2022-01-21 17:39:44,"여기에서 뒤에 딱지를 붙이는건 트랙을 분리하려는거고 톡방을 따로 만드는건 관심있는 대화주제를 이야기할 수 있단 장점이 있는거라고 생각되요"
    2022-01-21 17:40:05,"이거에 대해서 말하는겁니다..."
    2022-01-21 17:40:07,"여기에서 추천
    2022-01-21 17:40:20,"하신말씀을 잊어버리신거같네요 ㅎㅎ;;"
    $ cat kakaotalk.csv | cut -d , -f 1,2 | grep --line-buffered "2022" | cut -d , -f 2 | sort | uniq -c | sort -nr | head -n 5
    174 "손을 번쩍 든 무지"
    139 "건방진 제이지"
    129 "생각하는 라이언"
    71 "말썽쟁이 네오"
    69 "불나게 일하는 네오"

'MLOps' 카테고리의 다른 글

MLOps - 11. CI/CD, Github Action  (0) 2022.05.26
MLOps - 10. Cloud  (0) 2022.05.25
MLOps - 8. Streamlit 실습  (0) 2022.05.23
MLOps - 7. Streamlit  (0) 2022.05.23
MLOps - 6. Streamlit  (0) 2022.05.22

댓글