38일차 공부 정리

Linux

프로그래밍에 본격 입문한다면 특히 서버 관리를 할 때 리눅스를 많이 사용합니다.

리눅스는 서버에서 사용하는 OS중 무료이고 여러 버전이 존재하며 안정성과 신뢰성이 높아 자주 사용됩니다.

저 같은 경우 전산병 출신이라 군대 특기학교에서 가볍게 셀 명령어를 배운 적이 있는데 이번 기회에 기본적으로 알아야 하는 것을 체계적으로 정리하려 합니다.

우선 대표적인 Linux 배포판 부터 간단히 정리합니다.

  • Debian : 온라인 커뮤니티에서 제작해 배포
  • Ubuntu : 영국에서 배포, 초보자 사용이 쉬움, 마스터님도 주로 사용
  • Redhat : 레드햇에서 배포
  • CentOS : Redhat이 공개한 버전에서 브랜드 로고를 제거하고 배포

다음으로 간단한 쉘 명렬어를 정리해보겠습니다.

man 커맨드(python) : 매뉴얼 문서 보기, 실행이 오류나서 python --help로 대체해서 사용
mkdir 폴더이름(linux-test) : 폴더 생성
ls -al : 현재 폴더 확인. -a (숨김파일보기), -l(상세정보)
pwd : 현재 위치를 절대 경로로 보여줌
cd : 현재 위치 변경하기
echo "메세지": 터미널에 텍스트 출력
echo `pwd` : 1 옆에 있는 `(' 따움표와 다름) 사용하면 쉘 커맨드 결과 출력
vi 파일이름(vi-test).sh : vim 편집기로 파일 생성(관련해서 후술)
bash 파일이름(vi-test).sh : bash로 쉘 스크립트 실행
sudo : 관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo 붙임
cp -rf vi-test.sh vi-test2.sh : 파일 또는 폴더 복사. -r (하위 디렉토리도), -f(강제로 실행)
mv vi-test.sh vi-test3.sh : 파일 또는 폴더 이동하거나 이름 바꿀때 사용
cat vi-test.sh : 특정 파일 내용 출력
cat vi-test2.sh vi-test3.sh >(>>) new_test.sh : 여러 파일을 concat해서 출력
(> : 덮어쓰기 또는 생성, >> : 파일 내 추가(append))
clear : 터미널 창 깨끗하게 함
history : 최근에 입력한 쉘 커멘드 모두 출력
export water(변수명)="문구" : 환경변수 할당. 참고로 파이썬처럼 '=' 를 띄어쓰면 안됨
echo $water : $을 붙여야 할당된 값 출력 가능. 터미널 꺼지면 기억이 사라져서 .bashrc 등으로 저장필요
alias ll(별칭)='ls -l' : 기본 명령어를 간단하게 줄일 수 있음
head(tail) -n 숫자(3) 파일(vi-test.sh) : 파일 앞/뒤 n행 출력
grep -iwE 패턴 파일명 : -i(대소문자구분x), -w(정확히 그 단어만), -E(정규표현식 사용)
정규표현식 패턴 : ^단어(단어로 시작), 단어$(단어로 끝나는 것), .(하나의 문자 매칭)
'|' Pipe는 앞 쉘 출력을 다른 프로그램의 입력으로 사용하게 해줌
ls | grep "문구(vi)" : grep은 특정 단어를 찾게 해줍니다.
cat fruits.txt | sort (-r)| uniq : sort(정렬, -r은 내림차순), uniq(중복제거)
ls | grep "vi" > output.txt : vi 내용이 있는 ls 출력결과를 output.txt에 저장
history | grep "echo" : 최근 입력한 커맨드 중 echo가 들어간 명령어 찾기
ps -ef : 현재 실행하는 프로세스 출력, -ef(모든 프로세스 자세히)
df -h : 현재 사용중인 디스크용량 출력(명령어 이상이 없을 시 이 부분 체크) 
curl : 서버 요청 테스트, scp : ssh를 이용해 파일을 주고 받음. 이 부분 추가학습 필요
nohup python3 app.py & : 터미널 종료 후에도 실행 유지(백그라운드 실행)
chmod 권한(755) vi-test2.sh : 파일 권한 변경 (사용자, 그룹, Other)

vi 편집기는 Commend, Insert, Last Line 총 3개 모드가 존재합니다. Commend은 실행시 가장 먼저 접합니다.

Commend Mode에서 i를 누르면 Insert로, ‘:’을 누르면 Last Line으로 이동합니다.

Commend Mode에서 사용하는 명령어는 다음과 같습니다.

  • dd : 현재 위치한 한 줄 삭제
  • x : 현재 위치한 글자 1개 삭제 (5x : 글자 5개 삭제)
  • yy : 현재 줄을 복사
  • p : 현재 커서 바로 아래 붙여넣기
  • h, j, k, l : 커서 왼쪽/아래/위/오른쪽 으로 이동

Insert Mode는 파일을 수정할 수 있는 모드입니다. ESC를 입력하면 Commend로 이동합니다.

Last Line Mode은 Commend 에서 ‘:’를 입력하면 이동되는 모드로 사용하는 명령어는 다음과 같습니다.

  • w : 현재파일명으로 저장
  • q : vi 종료(w랑 같이 해야 저장됨, ! 붙이면 강제종료)
  • /문자 : 문자 탐색(탐색한 후 n 누르면 계속 탐색)

마지막으로 쉘 스크립트는 쉘 커맨드들의 조합입니다. Python과 유사하다고 합니다.

Docker

서비스를 개발할 때는 실제 운영에 사용하는 서버에 직접 들어가서 개발하지 않습니다.

이렇게 되면 OS나 라이브러리 버전, 또 환경변수가 다른 문제가 발생하는데요.

서버가 100개 이상이라면 Read.me로 환경설명을 하는 것도 한계가 있기 때문에 서버 환경도 소프트웨어화 하자는 개념으로 나온 것이 가상화 입니다.

대표적인 가상화 머신이 VM인데요. OS위에 OS를 실행하기 때문에 무겁다는 단점이 있습니다.

이를 극복하기 위해 경량화된 Container를 이용한 docker를 사용합니다. 쉽게 예시를 들면 예전 PC방에서 게임을 새로 깔아도 재부팅 하면 설치했던 것이 날라갔던 것과 비슷하다고 합니다.

Docker는 Image와 Container로 구분하는데요. 이미지는 템플릿, 컨테이너는 인스턴스로 이해할 수 있습니다.

다른 사람이 만든 Docker Image를 가져와 어느 환경에서도 동일하게 실행할 수 있습니다.

Docker 관련 명령어를 간단하게 적어보겠습니다. (다운로드 링크)

docker pull 이미지이름:태그(mysql:8) : 도커 이미지를 받아옴
docker images : 다운받은 이미지 목록을 확인
docker run --name 컨테이너이름(mysql-tutor) -e 환경변수설정(MYSQL_ROOT_PASSWORD=1234) -d 
-p 호스트포트:컨테이너포트(3306:3306) 이미지이름:태그(mysql:8) -v 호스트폴더:컨테이너폴더
: -e(필요한 환경변수 사용), -d(백그라운드 모드 사용), -p(포트 지정, mysql은 기본값 3306)
: -v(컨테이너와 호스트(로컬)간 저장소 공유)
docker ps : 실행중인 컨데이너 목록 확인
docker exec -it 컨테이너이름(mysql-tutor) bash(강의에선 /bin/bash)
: MYSQL이 실행하는지 확인하기 위해 컨테이너 진입(SSH 접속과 유사)
(mysql -u -root -p) : mysql 프로세스로 들어가기(쉘 화면이 보임)
docker stop/rm 컨테이너이름 : 컨테이너 중지/삭제

MLFlow

머신러닝 모델링 대회를 나가게 되면 실험기록의 중요성을 느끼게 됩니다. 개인 단위나 특히 팀 단위로 잘 해야겠다고 많이 생각이 들죠.

이런 고민을 덜어줄 수 있는 것이 MLFlow 입니다.

실험을 기록하거나 코드 재현, 모델 저장소 기록 심지어 모델 서빙까지 할 수 있습니다.

WandB와 유사하다고 느끼는데 실제 경험 해보면서 필요한지 따져보면 좋을 것 같아요.

느낀점

그냥 이름만 알고 있던 도구들을 개략적으로 알아보고 실습도 해보는 것 자체가 많이 배운 것 같습니다.

이런 저런 쪽으로 고민하라는 의도가 듬뿍 담긴 마스터님의 의도가 보였는데 많이 부족해서 다 못느낀 것 같네요.

level3에서 남들에게 짐이 되지 않도록 열심히 복습해야겠습니다.