0. 강의 소개
Part2의 지난 두 강의에서 웹 프로그래밍에 대한 지식이 없어도 프로토타이핑을 하는 방법에 대해서 학습을 하였는데요, Part2의 남은 과정에서는 그외의 전반적인 서빙을 위해 필요한 기술들에 대해서 학습을 해보도록 하겠습니다. 그 중 첫번째로 서버 프로그래밍을 위해 가장 중요한 Linux에 대한 지식과 Shell Command들에 대해서 학습해보는 시간을 이번 강의에서 갖도록 하겠습니다.
1. Linux
1.1 Linux를 알아야 하는 이유
- 서버에서 자주 사용하는 OS
- Mac, Window도 있으나… 유료!
- Free, 오픈소스
- 여러 버전이 존재, 개인 커스텀 가능
- 안전성, 신뢰성
- 굉장히 오래됨
- 쉘 커맨드, 쉘 스크립트
1.2 CLI, GUI
- CLI : Terminal
- Comand line interface
- GUI : Desktop
- Graphic user interface
- CLI 환경에 익숙해지자!!!
1.3 대표적인 Linux 배포판
- https://www.reddit.com/r/linuxmasterrace/comments/7diwwi/linux_distro_timelin
- Debian
- 온라인 커뮤니티에서 제작해 배포
- Ubuntu
- 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
- 초보자들이 쉽게 접근할 수 있도록 만듬
- Redhat
- 레드햇이라는 회사에서 배포한 리눅스
- CentOS
- Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전
1.5 Linux, Shell Script 학습 가이드
- 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
- 필요한 코드가 있는 경우 검색해서 찾기
- 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
- 왜 이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습(아마도 커널)
1.6 Linux를 사용하는 방법
- VirtualBox에 Linux 설치, Docker로 설치
- WSL 사용(윈도우)
- Notebook에서 터미널 실행
- 2.4 Cloud에서 띄우는 인스턴스에서 연습
2. Shell Command
2.1 쉘의 종류
- 쉘: 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
- 터미널/콘솔: 쉘을 실행하기 위해 문자를 입력받아 전달, 출력을 화면에 작성
- sh: 최초의 쉘
- bash: Linux 표준 쉘
- zsh: Mac 카탈리나 OS 기본 쉘
-
hostname : 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
username@hostname:current_folder
2.2 쉘을 사용하는 경우
- 서버에서 접속해서 사용하는 경우
- crontab 등 Linux의 내장 기능을 활용하는 경우
- 데이터 전처리를 하기 위해 쉘 커맨드를 사용
- Docker를 사용하는 경우
- 수백대의 서버를 관리할 경우
- Jupyter Notebook의 Cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
- 터미널에서 python3, jupyter notebook 도 쉘 커맨드
- Test Code 실행
- 배포 파이프라인 실행(Github Action 등에서 실행)
2.3 기본 쉘 커맨드
- mkdir : 폴더 생성
mkdir folder_name
- ls : 현재 접근한 폴더의 폴더, 파일 확인 (List Segments)
ls -a # .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력
ls -l # 퍼미션, 소유자, 만든 날짜, 용량까지 출력
ls -h # 용량을 사람이 읽기 쉽도록 GB, MB 등 표현
- pwd : 현재 폴더 경로를 절대경로로 보여줌 (Print Working Directory)
- cd : 경로, 폴더 이동 변경 (change directory)
- echo : 터미널에 텍스트 출력
- backtick `:1 왼쪽에 있는
# 절대경로를 출력 echo `pwd`
- vi : vim 편집기 실행
- Command Mode
- dd : 현재 위치한 한 줄 삭제
- i : INSERT 모드로 변경
- x : 커서가 위치한 곳의 글자 1개 삭제(5x : 문자 5개 삭제)
- yy : 현재 줄을 복사(1줄을 ctrl + c)
- p : 현재 커서가 있는 줄 바로 아래에 붙여넣기
- k : 커서 위로
- j : 커서 아래로
- l : 커서 오른쪽으로
- h : 커서 왼쪽으로
- Insert Mode
- i : INSERT 모드로 변경
- 입력이 가능한 모드
- Last Line Mode
- ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
- w : 현재 파일명으로 저장
- q : vi 종료(저장되지 않음)
- q! : vi 강제 종료(!는 강제를 의미)
- wq : 저장한 후 종료
- /문자 : 문자 탐색
-
- 탐색한 후 n을 누르면 계속 탐색 실행
- set nu : vi 라인 번호 출력
- Command Mode
- bash : 쉘 스크립트 실행
- sudo : 관리자 권한, 슈퍼유저
-
cp : copy
# -r 디렉토리 안에 있는 거 전부 복사 # -f 복사 강제 실행 cp vi-test.sh vi-test2.sh
- mv : move
- cat : 특정 파일 내용 출력 (concatenate)
- 여러 파일을 인자로 주면 합쳐서 출력
-
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 출력
-
find : 파일 및 디렉토리 검색
# 현재 폴더에서 "File" 이라는 이름이 포함된 파일 및 디렉토리 찾기 find . -name “File”
- export : 환경변수 설정
- export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨
- alias : 별칭 설정
- 긴 명령어를 짧게!
- head, tail
- 파일의 앞뒤 n 행 출력
- sort
- 행단위 정렬
- -r: 내림차순으로
- -n: Numeric Sort
- uniq
- 중복된 행이 연속으로 있는 경우 중복 제거
- sort와 함께 사용
- -c : 중복 행의 개수 출력
cat fruits.txt | sort | uniq # word count line 수 cat fruits.txt | sort | uniq | wc -l
- grep
- 파일에 주어진 패턴 목록과 매칭되는 라인 검색
- grep 옵션 패턴 파일명
- 옵션
- -i : Insensitively하게, 대소문자 구분 없이 찾기
- -w : 정확히 그 단어만 찾기
- -v: 특정 패턴 제외한 결과 출력
- -E : 정규 표현식 사용
- cut
- 파일에서 특정 필드 추출
- 옵션
- -f : 잘라낼 필드 지정
- -d : 필드를 구분하는 구분자. Default는 \t
- 표준 스트림
- stdin : 0으로 표현, 입력(비밀번호, 커맨드 등)
- stdout : 1로 표현, 출력 값(터미널에 나오는 값)
- stderr : 2로 표현, 디버깅 정보나 에러 출력
2.4 Redirection & Pipe
- Redirection : 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
- Pipe : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
- A의 Output을 B의 Input으로 사용
# grep “vi” 결과를 output.txt에 저장 ls | grep “vi” > output.txt
2.5 서버에서 자주 사용하는 쉘 커맨드
- ps : Process Status
- -e : 모든 프로세스
- -f : Full Format으로 자세히 보여줌
- curl : Client URL
- Command Line 기반의 Data Transfer 커맨드
# 웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음 curl -X localhost:5000/ {data}
- df : Disk Free
- 현재 사용 중인 디스크 용량 확인
- -h : 사람이 읽기 쉬운 형태로 출력
- scp : Secure Copy(Remote file copy program)
- SSH을 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어
- 옵션
- -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
- nohup : 터미널 종료 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)
- nohup으로 실행될 파일은 Permission이 755여야 함
- chmod : Change Mode
- 파일의 권한을 변경하는 경우 사용
- Permission
- r = Read(읽기), 4
- w = Write(쓰기), 2
- x = eXecute(실행하기), 1
-
- = Denied
- r-x : 읽거나 실행할 수는 있지만 수정은 불가능
- 755, 644로 퍼미션을 주세요! 라고 하는 경우가 존재
- rwx를 더하면 4+2+1 = 7
2.6 쉘 스크립트
- .sh 파일을 생성하고, 그 안에 쉘 커맨드를 추가
- 쉘 커맨드의 조합
- 파이썬처럼 if, while, case 문이 존재
- 참고 자료
- https://github.com/zzsza/shell-scripts
- https://github.com/denysdovhan/bash-handbook
- https://github.com/epety/100-shell-script-examples
3. Special Mission
- 학습한 쉘 커맨드 정리하기
- 카카오톡 그룹 채팅방에서 옵션 - 대화 내보내기로 csv로 저장 후, 쉘 커맨드 1줄로 카카오톡 대화방에서 2021년에 제일 메세지를 많이 보낸 TOP 3명 추출하기! 카카오톡에서 CSV로 변환할때 한글이 깨지는 경우에는 다음 링크를 참고해서 해결해주세요! https://mentha2.tistory.com/162
Reference
- AI boot camp 2기 서빙 강의