클라우드 서비스 개발자를 위한 AWS로 구현하는 CI/CD 배포 입문을 읽으며 학습한 내용을 정리한다.
터미널 화면을 비울 때 사용하는 명령어


현재 내가 위치한 경로를 알려주는 명령어

폴더 간의 이동할 때 사용하는 명령어
cd 경로 : 해당 폴더로 이동

cd .. : 한칸 상위 폴더로 이동

cd / : 최상위 경로로 한 번에 이동

현재 폴더에 있는 모든 파일과 폴더의 상태를 확인하는 명령어

ls -l : 폴더와 파일들의 상태를 자세히 확인

색이 파란색이면 폴더이고 하얀색이면 파일이다.
또한 앞이 d 가 아닌 - 가 붙으면 파일이다.
-l : long format, 파일 및 디렉토리의 자세한 정보를 리스트 형태로 출력한다. 이 옵션을 사용시 파일의 소유자, 그룹, 크기, 수정 날짜 및 권한 등의 정보를 얻을 수 있다.
ls -a : 숨김 폴더 및 파일까지 확인

-a : all, 숨겨진 파일 및 디렉토리를 포함하여 모든 파일과 디렉토리를 나열
숨겨진 파일 및 디렉토리는 이름이 마침표 . 로 시작한다.
지금까지 cd desktop 으로 이동하던 것은 상대 경로로 이동하는 방식이다.
절대 경로로 이동시 최상위 폴더 / 로부터 이동한다.

명령어의 사용법을 알려준다.
macOS 에선 --help 로 동작하지 않고 대신 man [명령어] 로 사용법을 확인할 수 있다.

man: manual, 원하는 명령어의 매뉴얼 확인 가능

폴더를 생성

파일을 생성

폴더나 파일을 삭제


-f: 삭제가 안될 때 강제 삭제 옵션
-r: 폴더를 삭제할 때 폴더 내부에 파일이 있다면 그것까지 함께 삭제하는 옵션

존재하지 않는걸 삭제하려고 하면 없다고 알려준다.

ctrl + c : 인터럽트, 프로그램이 작동을 멈추거나 명령어를 인식하지 못해 대기하는 경우 명령을 취소
파일을 복사할 때 사용하는 명령어

파일의 위치를 이동시킬 때 사용하는 명령어

파일 이동시 파일명을 변경할 수 있다.

현재 경로 그대로 파일명을 변경할 수 있다.

ls -s a.txt a-link.txt
보라색 파일
ls-l 을 보면 권한에서 l 로 시작하는 것을 볼 수 있는데 이 파일은 실제 존재하는 파일이 아닌 바로가기 파일이다.

사실 ec2 에서 linux2 AMI를 선택했는데 이는 apt 가 아닌 yum 을 지원한다고 하여 sudo yum update 라고 이해하면 된다.
AMI (Amazon Machine Image): 가상 머신(인스턴스)을 생성할 때 사용되는 템플릿으로 운영체제 (OS)와 사전 설치된 소프트웨어, 설정 등의정보를 포함한다.
처음 yum 목록에 아무런 메뉴가 없기에 메뉴판을 갱신하기 위해 yum update 를 한다.
처음 yum update 시 권한이 없다고 뜨며 이때 sudo 를 앞에 붙여줘서 슈퍼 유저의 권한을 위임받아 실행할 수 있다.

whoami
위의 명령어로 현재 어떤 사용자로 사용중인지 확인할 수 있다.
참고중인 서적 클라우드 서비스 개발자를 위한 AWS로 구현하는 CI/CD 배포 입문 은 ubuntu 기반으로 설명이 되어 있으나 나는 ec2 에서 linux 2 를 선택했기에 Linux/Unix Power Tools 사이트를 참고하여 비교하였다.
apt-cache search tomcat 과 동일
tomcat 이라는 프로그램이 메뉴판에 있는지 검색한다.

존재한다.
|검색 결과를 걸러서 다시 검색할 수 있게 한다.
파일 내용을 빠짐없이 확인해서 찾는 문자열이 포함되었는지 조사한다.
grep -r [찾고 싶은 내용] [찾을 파일이 있는 폴더 경로(검색 시작점)]
-r: 서브 폴더까지 검색하도록 지정
grep: global regular expression pring, 파일 전체에서 정규 표현식과 일치하는 위치를 출력하라.
정규 표현식: 특수한 기호를 써서 검색하고 싶은 내용을 유연하게 표현하는 서식
| 기호 | 의미 |
|---|---|
| () | 그룹화 |
| | | 좌우 중 하나 |
| ? | 직전 표현이 0회 또는 1회 등장 |
| * | 직전 표현이 0회 이상 연속해서 등장 |
| + | 직전 표현이 1회 이상 연속해서 등장 |
| . | 임의의 한 문자 |
| ^ | 줄 머리 |
| $ | 줄 끝 |
예시
(야메노|yameno|YAMENO) ? (타로|tarou|TAROU)
? 는 스페이스가 0회 또는 1회 등장을 의미
grep -r -i -E "(야메노|yameno|YAMENO) ? (타로|tarou|TAROU)" [디렉토리 경로]
-E: 정규 표현식 사용시 -E 옵션 사용
-i: ignore case, 알파벳 대문자 소문자 차이를 무시하고 검색하는 옵션
다시 돌아와서 설치된 패키지중 tomcat 을 검색하여 tomcat 이라는 이름을 포함하는 파일을 찾는다.

애초에 설치되어 있는 패키지는 모두 tomcat 이 이름에 포함되어 있어서 일치되는 부분이 표시된다.
yum list | grep tomcat
설치 가능한 모든 패키지중 tomcat 과 관련된 패키지를 검색한 결과이다.

포트 확인
netstat -nlpt
netstat -nlpt: 네트워크 상태를 확인하기 위한 명령어
n: IP 주소와 포트 번호를 숫자 형식으로 표시
l: 리스닝 상태인 포트만 표시, 즉 현재 시스템에서 대기 중인 연결을 나타낸다.
p: 프로세스 ID와 함께 포트를 소유한 프로세스를 나타낸다.
t: TCP 연결만 표시한다.

침고로 패키지 목록은
yum명령어 실행시 자동으로 갱신된다. 이는apt update와 같은 동작을 한다.
지금 실행중인 프로세스의 목록 확인
화면에 출력하기 위한 명령어이다. ps -ef 의 결과를 사용하여 명령어 치환을 하려면 백틱 ` 을 사용한다.
(백틱은 legacy syntax로 문제를 일으킬 수 있으니 $()를 사용하는 것을 권장한다고 한다.)
kill `ps -ef | grep tomcat8 | grep -v grep | awk '{print $2}'`
UID: 프로세스의 주인
PID: 프로세스의 아이디
C: 프로세스의 CPU 사용량
STIME: 프로세스가 시작된 시간
TTY: 프로세스가 연결된 터미널 장치
CMD: 프로세스가 실행 중인 명령어 또는 프로그램의 이름
-ef: 모든 프로세스를 상세하게 표시, PID, PPID(부모 프로세스 ID), CPU 사용량, 시작 시간 등의 정보를 포함하여 프로세스에 대한 상세한 정보를 표시한다.

kill -l : 종료하는 방법에 대한 옵션들을 볼 수 있다.

이중 9번이 눈에 띈다.
kill -9 [PID]
port 8080 was already in-use
이런 식으로 오류가 뜰때 이미 8080포트를 사용중인 PID 를 강제 종료할때 많이 사용했다.
프로세스를 안전하게 종료하려면 15번 옵션인 SIGTERM 을 사용한다.
프로세스를 종료할 권한이 없다면 sudo 를 붙인다.
특정 프로세스를 종료하려면 미리 ps-ef 와 grep 을 통해 검색할 수 있다.

위의 자료를 보면 ps-ef 로 검색한 것조차 리스트에 나온다. 즉, 내가 입력했던 명령어 조차도 프로세스가 되어 목록에 나타난다는 의미이다.
명령을 제외하기 위해 grep 명령어의 -v 속성으로 제외시킬 수 있다.
ps -ef | grep ec2-user | grep -v grep

메모장과 같은 에디터
vi [파일명] 으로 파일을 열고 수정할 수 있는데 없는 파일일 경우 현재 디렉토리에서 해당 파일명으로 파일을 생성해서 수정한다.
| 단축키 | 기능 |
|---|---|
| 마우스 우클릭 | 외부 코드 붙여넣기 |
| shift + v | 블록 지정 |
| x | 현재 커서의 문자 삭제 |
| dd | 현재 행 삭제 |
| yy | 현재 행 복사 |
| p | 붙여 넣기 |
| home | 행의 맨 처음으로 이동 |
| $ | 행의 맨 끝으로 이동 |
| ctrl + b | 위로 한 화면 스크롤 |
| ctrl + f | 아래로 한 화면 스크롤 |
매번 editor 창이 뜰때 마우스 드래그로 복사도 못하고 여러 칸 이동이 불가능해서 화살표로 한칸씩 문자를 이동하던게 정말 불편했는데 이걸 이제라도 알게되어 다행이다.
shift + v : ctrl 을 누르고 있는 상태와 같아서 화살표를 통해 처음 shift + v 를 하여 선택한 블록을 시작으로 여러 줄을 드래그할 수 있다. 그 상태에서 복사, 삭제, 붙여넣기 등이 가능하다.

| 단축키 | 기능 |
|---|---|
| i | insert mode 로 변경 (현재 커서 위치에 내용 추가) |
| a | append mode 로 변경 (현재 커서 위치 한칸 뒤에 내용 추가) |
| o | open line mode 로 변경 (현재 커서 한라인 아래에 내용 추가) |
| esc | normal mode 로 변경 |
| :w | 저장 |
| :q | 에디터 종료 |
| :q! | 강제 에디터 종료 |
| :wq | 저장 후 종료 |
| :wq! | 강제로 덮어쓰고 종료 |
| h,jㅏl | 커서 좌, 하, 상, 우 |
-rw-r--r--
제일 앞의 기호가 - 이면 파일이고 d 이면 디렉토리다.
권한에는r 파일읽기, w 파일 쓰기, x 파일 실행이 있고 각각 4, 2, 1로 계산하여 숫자로 나타낼 수 있다.
위의 경우는 4+2 / 4 / 4 로 권한이 644 이다.
만일 누구나 파일을 수정하고 싶다면 세 번째 묶음에 w 권한을 부여해야 해서 권한이 646 으로 바뀌어야 한다. 이때 필요한 명령어가 chmod 이다.
모두에게 전체 권한을 부여한다면 777 권한을 부여한다.
chmod [권한(숫자 또는 문자로 표시)][타겟]
chmod 646 test.txt
ls -l 을 볼때 맨 앞에 나오는 부분을 통해 해당 디렉토리, 파일의 권한을 계산할 수 있다.

파일의 가장 끝 부분의 10줄을 출력해주는 명령어이다.

-f: 실시간으로 남는 로그를 보여준다.
spring boot 프로젝트에 gitlab을 통한 CI/CD 를 해보고 싶다. 그런데 전에 deploy.sh 파일 자체는 써봤어도 다른 사람이 다 짜준걸 활용해봤을 뿐이었다. 그 내부를 봤었을때 처음 보는 규칙으로 이루어진 문자들이 나열되어 있었는데 CI/CD 를 하기 위해 이 셸 스크립트를 짜야 한다는 것을 알게 되었다. 그럼에도 불구하고 GitLab 의 셸 스크립트 샘플들을 봤을때 이해가 잘 되지 않았다. 그래서 리눅스 명령어부터 먼저 학습하고 셸 스크립트를 짜고자 했다.
어느정도 이해가 되었다. 이제 진짜 CI/CD 를 구현해보자. 지금까지 test - push - pull request - merge - ec2 deploy - ec2 build, test ... 의 과정을 끝내고 push 만으로 이 일련의 과정을 자동화해보자. 더 나은 개발자가 될 수 있도록 조금씩 나아가고자 한다.
클라우드 서비스 개발자를 위한 AWS로 구현하는 CI/CD 배포 입문
Linux/Unix Power Tools
만화로 배우는 리눅스 시스템 관리 1권