일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- N2N
- word2vec
- dataset
- 딥러닝
- nlp
- mrc
- AI 경진대회
- Transformer
- pyTorch
- 기아
- Ai
- Attention
- AI Math
- passage retrieval
- 데이터 구축
- ODQA
- N21
- 2023 현대차·기아 CTO AI 경진대회
- Bert
- Optimization
- Self-attention
- 현대자동차
- matplotlib
- GPT
- Bart
- 데이터 시각화
- RNN
- Data Viz
- seaborn
- KLUE
- Today
- Total
쉬엄쉬엄블로그
(AI 서비스 개발 기초) Linux & Shell Command 본문
이 색깔은 주석이라 무시하셔도 됩니다.
Part 2. 프로토타입부터 점진적으로 개선하기
Linux
Linux를 알아야 하는 이유
- 서버에서 자주 사용하는 OS
- Mac, Windows도 서버로 활용은 가능하나 유료
- Free, 오픈소스
- 여러 버전이 존재 ⇒ 여러분들의 버전을 만들 수 있음
- 안전성, 신뢰성, 유닉스라 Stability, Reliability
- 쉘 커맨드, 쉘 스크립트
CLI
- CLI : Terminal
- Command Line Interface
GUI
- GUI : Desktop
- Graphic User Interface
대표적인 Linux 배포판
- Debian
- 온라인 커뮤니티에서 제작해 배포
- Ubuntu
- 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
- 초보자들이 쉽게 접근할 수 있도록 만듬
- Redhat
- 레드햇이라는 회사에서 배포한 리눅스
- CentOS
- Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전
Linux, Shell Script 학습 가이드
- 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
- 필요한 코드가 있는 경우 검색해서 찾기
- 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
- 왜 이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습(아마도 커널)
Linux를 사용하는 방법
- VirtualBox에 Linux 설치, Docker로 설치
- WSL 사용(윈도우)
- Notebook에서 터미널 실행
- 2.4 Cloud에서 띄우는 인스턴스에서 연습 - 추천
Shell Command
쉘의 종류
- 쉘
- 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
- 터미널/콘솔
- 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달
- 프로그램의 출력을 화면에 작성
- sh
- 최초의 쉘
- bash
- Linux 표준 쉘
- zsh
- Mac 카탈리나 OS 기본 쉘
쉘 UX
쉘을 사용하는 경우
- 서버에서 접속해서 사용하는 경우
- crontab 등 Linux의 내장 기능을 활용하는 경우
- 데이터 전처리를 하기 위해 쉘 커맨드를 사용
- Docker를 사용하는 경우
- 수백대의 서버를 관리할 경우
- Jupyter Notebook의 Cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
- 터미널에서 python3, jupyter notebook도 쉘 커맨드
- Test Code 실행
- 배포 파이프라인 실행(Github Action 등에서 실행)
기본 쉘 커맨드
man
- 쉘 커맨드의 매뉴얼 문서를 보고 싶은 경우
- man python
- 종료 : ‘:q’ 입력
mkdir
- 폴더 생성하기 : Make Directory
- mkdir linux-test
ls
- 현재 접근한 폴더의 폴더, 파일 확인 : List Segments
- ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 실행
- 폴더를 작성하면 폴더 기준에서 실행
- 옵션
- -a : .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력
- -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력
- -h : 용량을 사람이 읽기 쉽도록 MB, GB 등으로 표현
pwd
- 현재 폴더 경로를 절대 경로로 보여줌 : Print Working Directory
cd
- 폴더 변경하기, 폴더로 이동하기 : Change Directory
echo
- Python의 print처럼 터미널에 텍스트 출력
- echo
쉘 커맨드
입력시 쉘 커맨드의 결과를 출력. ` : 1 왼쪽에 있는 backtick - echo
pwd
vi
vim 편집기로 파일 생성
- INSERT 모드에서만 수정할 수 있음
vi vi-test.sh
- (새로운 창이 뜨면) i를 눌러서 INSERT 모드로 변경
- 그 후 echo “hi” 작성
- ESC를 누른 후 : wq (저장하고 나가기, write and quit)
- ESC : wq! : 강제로 저장하고 나가기
- ESC : q : 그냥 나가기
vi 편집기의 Mode
Command Mode
- vi 실행시 기본 Mode
- 방향키를 통해 커서를 이동할 수 있음
- dd : 현재 위치한 한 줄 삭제
- i : INSERT 모드로 변경
- x : 커서가 위치한 곳의 글자 1개 삭제(5x : 문자 5개 삭제)
- yy : 현재 줄을 복사(1줄을 ctrl + c)
- p : 현재 커서가 있는 줄 바로 아래에 붙여넣기
- k : 커서 위로
- j : 커서 아래로
- l : 커서 오른쪽으로
- h : 커서 왼쪽으로
- vi 실행시 기본 Mode
Insert Mode
- 파일을 수정할 수 있는 Mode
- 만약 Command Mode로 다시 이동하고 싶다면 ESC 입력
Last Line Mode
- ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
- w : 현재 파일명으로 저장
- q : vi 종료(저장되지 않음)
- q! : vi 강제 종료(!는 강제를 의미)
- wq : 저장한 후 종료
- /문자 : 문자 탐색
- 탐색한 후 n을 누르면 계속 탐색 실행
- set nu : vi 라인 번호 출력
bash
- bash로 쉘 스크립트 실행
- bash vi-test.sh
- 앞에서 작성한 “hi”가 출력
- 터미널에서 Tab을 누르면 자동완성(지원하지 않는 쉘도 존재)
sudo
- 관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo를 붙임
- sudo 명령어 : 최고 권한을 가진 슈퍼 유저로 프로그램을 실행
- “superuser do”에서 유래하고, 최근엔 “substitute user do”(다른 사용자의 권한으로 실행)의 줄임말로 해석
cp
- 파일 또는 폴더 복사하기 : Copy
- cp vi-test.sh vi-test2.sh
- -r : 디렉터리를 복사할 때 디렉터리 안에 파일이 있으면 reculsive(재귀적)으로 모두 복사
- -f : 복사할 때 강제로 실행
mv
- 파일, 폴더 이동하기(또는 이름 바꿀 때도 활용) : Move
- mv vi-test.sh vi-test3.sh
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
clear
- 터미널 창을 깨끗하게 해줌
history
최근에 입력한 쉘 커맨드 History 출력
History 결과에서 느낌표를 붙이고 숫자 입력시 그 커맨드를 다시 활용할 수 있음
!30
find
- 파일 및 디렉터리를 검색할 때 사용
- find . -name “File” : 현재 폴더에서 File이란 이름을 가지는 파일 및 디렉토리 검색
export
- export로 환경 변수 설정
- export water=”물”
- echo $water
- export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨
- 매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, zshrc에 저장하면 됨
- (Linux) vi ~/.bashrc 또는 vi ~/.zshrc (자신이 사용하는 쉘에 따라 다름)
- 제일 하단에 export water=”물”을 저장하고 나옴(ESC :wq)
- 그 후 source ~/.bashrc 또는 source ~/.zshrc
- Linux 환경 설정을 재로그인하지 않고 즉시 적용하고 싶은 경우 source 사용
alias
- 터미널에서 alias라고 치면 현재 별칭으로 설정된 것을 볼 수 있음
- alias는 기본 명령어를 간단히 줄일 수 있는 것
- 예) ll는 ls -l로 별칭이 지정되어 있음
- alias ll2=’ls -l’
- ll2를 입력하면 ls -l이 동작됨
위 커맨드들은 일상처럼 사용할 수 있도록 연습
쉘 커맨드
- head, tail
- 파일의 앞/뒤 n행 출력
- head -n 3 vi-test.sh
- sort
- 행 단위 정렬
- -r : 정렬을 내림차순으로 정렬(Default 옵션 : 오름차순)
- -n : Numeric Sort
- vi fruits.txt
- cat fruits.txt | sort
- cat fruits.txt | sort -r
- uniq
- 중복된 행이 연속으로 있는 경우 중복 제거
- sort와 함께 사용
- -c : 중복 행의 개수 출력
- cat fruits.txt | uniq
- cat fruits.txt | sort | uniq
- cat fruits.txt | uniq | wc -l
- cat fruits.txt | sort | uniq | wc -l
- grep
- 파일에 주어진 패턴 목록과 매칭되는 라인 검색
- grep 옵션 패턴 파일명
- 옵션
- -i : Insensitively하게, 대소문자 구분 없이 찾기
- -w : 정확히 그 단어만 찾기
- -v : 특정 패턴 제외한 결과 출력
- -E : 정규 표현식 사용
- 정규 표현식 패턴
- ^단어 : 단어로 시작하는 것 찾기
- 단어$ : 단어로 끝나는 것 찾기
- . : 하나의 문자 매칭
- cut
- 파일에서 특정 필드 추출
- -f : 잘라낼 필드 지정
- -d : 필드를 구분하는 구분자. Default는 \t
- cat cut_file | cut -d : -f 1,7
- 1번째, 7번째 값을 가져옴
표준 스트림(Stream)
- Unix에서 동작하는 프로그램은 커맨드 실행시 3개의 Stream이 생성
- stdin : 0으로 표현, 입력(비밀번호, 커맨드 등)
- stdout : 1로 표현, 출력 값(터미널에 나오는 값)
- stderr : 2로 표현, 디버깅 정보나 에러 출력
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”
- 연습 문제
- test.txt 파일에 “Hi!!!!”를 입력 (vi 사용 금지)
- test.txt 파일 맨 아래에 “kkkkk”를 입력 (vi 사용 금지)
- test.txt의 라인 수 구하기 (힌트 : wc -l을 쓰면 라인 수를 구할 수 있음)
서버에서 자주 사용하는 쉘 커맨드
ps
- 현재 실행되고 있는 프로세스 출력하기 : Process Status
- -e : 모든 프로세스
- -f : Full Format으로 자세히 보여줌
curl
- Command Line 기반의 Data Transfer 커맨드 : Client URL
- Request를 테스트할 수 있는 명령어
- 웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음
- curl -X localhost:5000/ {data}
- curl 외에 httpie 등도 있음(더 가독성있게 출력)
df
- 현재 사용 중인 디스크 용량 확인 : Disk Free
- -h : 사람이 읽기 쉬운 형태로 출력
scp
- SSH를 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어 : Secure Copy(Remote file 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:traget_remote_directory
nohup
- 터미널 종료 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)
- nohup python3 app.py &
- nohup으로 실행될 파일은 permission이 755여야 함
- 종료는 ps ef | grep app.py 한 후, pid(Process ID) 찾은 후 kill -9 pid로 프로세스를 kill
- 로그는 nohup.out에 저장됨
- nohup 외에도 screen이란 도구도 있음
chmod
파일의 권한을 변경하는 경우 사용 : Change Mode
유닉스에서 파일이나 디렉터리의 시스템 모드를 변경함
ls -al(혹은 ll)을 입력하면 다음과 같이 나옴
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이 변경됨
쉘 스크립트
.sh 파일을 생성하고, 그 안에 쉘 커맨드를 추가
파이썬처럼 if, while, case 문이 존재하며 작성시 bash name.sh로 실행 가능
예시
쉘 스크립트 = 쉘 커맨드의 조합
쉘 커맨드에 익숙해진 후, 스크립트로 생성(Python과 유사)
지금은 쉘 커맨드에 많이 익숙해진 후, 추후에 하나씩 만들어보기(쉘 커맨드가 항상 베이스)
https://github.com/epety/100-shell-script-examples
출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)
'부스트캠프 AI Tech 4기' 카테고리의 다른 글
(AI 서비스 개발 기초) MLflow (0) | 2023.08.10 |
---|---|
(AI 서비스 개발 기초) Docker (0) | 2023.08.09 |
(AI 서비스 개발 기초) 웹 서비스 형태 - Streamlit (0) | 2023.08.07 |
(AI 서비스 개발 기초) Notebook 베이스 - Voila (0) | 2023.08.04 |
(AI 서비스 개발 기초) 머신러닝 프로젝트 라이프 사이클 (0) | 2023.08.03 |