리눅스 기본 명령어와 친해져 보자

허준현·2021년 9월 11일
0

ComputerScience

목록 보기
1/1
post-thumbnail

공부 계기

최근에 학교에서도 유닉스 프로그램을 배우기도 하면서 쏘마에서 지원받은 돈으로 만화로 배우는 리눅스 시스템 관리를 읽으면서 그 동안에 linux command 에 대해 작성하고자 한다.

./ , ../


처음에 command를 배울 때 자주 사용 하는 cd 와 ls 다음으로 chmod 같이 자세히 보고 싶을때 ls -al 를 주로 사용한다.
이 때에도 불 수 있듯이 ./ 와 ../ 가 명시되어 있는데 그만큼 리눅스 환경에서는 경로를 명시해야 하는 것을 알 수 있다.
더 자세히 말하고자 하면 리눅스에서 실행 파일 앞에 ./를 지정해 주는 이유는 윈도우에서는 기본적으로 현재 디렉토리르 ㄹ지정해 주지 않아도 현재 디렉토리를 최우선으로 찾기 때문에 필수는 아니지만 리눅스에서는 명확하게 지정해야 하는 것이다.
하지만 예외도 있었는데 파일이 /bin/ 에 있거나 /usr/bin/ 에 있으면 실행파일만 작성해도 된다.
처음에 부끄럽게도 학교 실습을 따라하던 도중 코드를 똑같이 작성하였는데도 실행파일이 실행이 안되서 해맨 기억이 있다.😡

What is sudo?

리눅스 환경에서 대부분이 sudo를 한 번 쯤 겪어 보았을 것이다. 우선 뜻을 파해쳐 보면 sudo는 'substitute user do ' 라는 의미로 다른 사용자의 권한으로 실행 한다는 것이다. 우선적으로 루트 권한을 사용하게 된다면 파일의 소유권에 대해 뒤죽박죽 이 되거나 중요한 시스템 파일을 삭제하여 다시 os를 설치해야 하는 경우도 있다.
추가적으로 혼자 생각해 보았을 때 사용자의 권한이 막힐 때 마다 sudo를 무의식적으로 사용하는 사람들도 있는데 이제 와서 돌이켜 생각해 보면 sudo를 사용해야 하는 명령어에 대해 다시 한 번 생각해 보라는 의미를 전달하는 것 같다.

grep

리눅스에서는 해당 경로에서 혹은 파일에서 특정 문자열을 찾고 싶을 때 사용하는 명령어이다. 가장 많이들 사용하는 명령어 이기도 하며 정규식(Regular Expression)도 제공하여 패턴 매칭도 사용하기에 용이하다.
우선적으로 grep은 (global regular express print)의 약자로 일치하는 위치를 출력하는 정도로 생각하면 될 것 같다.
grep [OPTION][PATTERN] [FILE]
위와 같은 명령어 이며 OPTION에는 여러가지가 있지만 그중에서 3가지만 알아보고자 한다.

-i : 대/ 소문자 무시
-E : 패턴을 정규 표현식으로 해석
-r : 하위 디렉토리를 재귀적으로 탐색

예시로 grep -r recommand ./data 라는 명령어가 있으면 이는 ./data 내부에서 recommand 문자열이 들어간 파일의 위치를 출력하는 것이다.

Vim

git 으로 프로젝트를 서버에 올리고 나서도 gitignore 안에 들어 있는 config 파일을 작성하기 위해 vi config.py 로 많이들 사용 해봤을 것이다. 기본적인 노멀모드에서 삽입모드를 들어가기 위한 i 와 해당 라인을 지우기 위한 노멀모드에서 dd 정도는 생략하고 vim을 작성함에 있어서 알아두었으면 좋았던 것을 정리하고자 한다.

1.노멀모드에서 / 를 누르면 검색모드로 들아가며 그냥 검색 및 \v 하고 패턴을 넣어 정규식으로 찾을 수 있다.
2.리눅스 콘솔에서의 Ctrl+z 는 지금 실행중인 애플리케이션을 정지하는 명령어 이며 뒤로 돌아가는 명령어가 아니다. 따라서 정지한 애플리케이션으로 다시 돌아가고 싶다면
fg 를 사용한다. (의미는 background로 돌아간 애플리케이션을 foregroud로 돌리기)
3. 앞에서 언급한 ctrl +z 와 같이 되돌리기를 하고 싶다면 undo 인 u를 사용하고 되돌리기를 되돌리고 싶다면 ctrl+redo 즉 "ctrl+r" 을 사용하면 된다. 간편히 shift+u 아니면 r이었으면 좋겠는데 이미 있는 명령어라 이렇게 한다고 한다.

redirection >, pipeline |

리눅스에서 > 는 리눅스의 스트림 방향을 조절하는 명령어로 명령어를 정하거나 입력으로 사용 할때 자주 사용한다.

cat f1, f2 > f3 : f1,f2를 f3 파일에 저장
cat f1 >> f3 : f3 파일 에 f1내용을 추가
cat < f1 : f1의 내용을 출력

또 자주 사용하는 파이프 라인은 명령어들을 연결 시켜주는 역할을 한다.

grep recommand /etc | sort > sort.out
/etc 파일 안에 recommand가 포함 된 줄을 정렬하여 sort.out에 저장하라!

파이프 라인을 기준으로 좌측에는 표준 출력(stdout) 우측에는 표준 입력인(stdin)을 사용한다. 따라서 표준 입력으로 cut,more , grep 을 자주 사용한다.
|| 는 첫번째 명령의 결과가 에러가 발생한 경우 뒤의 명령을 실행하는 명령어다.

scp

지금까지 리눅스 서버에 파일을 전송하고 싶은 일이 있으면 git을 활용하여 git pull 로 받아와 놓고자 하는 파일에 옮기는 식으로 구현하였다. 하지만 이렇게 전송하고 싶은 파일을 git으로 옮기는 비효율 적인 방식 보다는 scp를 사용하여 파일을 옮길 수 있다. scp는 우선적으로 연결하기 전에 ssh를 불러오고 그 위에서 파일을 보내는 방식이다.
예를 들어 현재 디렉토리에 있는 file.txt 파일을 리눅스 /tmp/ 로 보내고 싶다면
scp ./file.txt denhur62@192.168.1.10:/tmp/ 로 보내면 된다.

만약에 서버에 있는 파일을 자신의 데스크탑으로 옮기고 싶다면
scp denhur62@192.168.1.10:/tmp/file.txt ./ 로 받을 수 있다.
또 한 grep 에서 말한 옵션처럼 -r을 사용하게 된다면 해당 디렉토리 안에 있는 자식 디렉토리도 복사할 수 있다.

top


현재 소마 프로젝트를 진행함에 있어서 인스턴스에 아에 접근도 못하는 일이 발생하였다. 아직 확실한 이유를 찾지는 못하였지만 아마도 CPU 를 잡고 있거나 메모리를 많이 먹는 어떠한 프로세스때문에 발생한 것을 추측하고 CPU 타임,메모리 사용량을 많이 잡아먹는 프로세스를 지켜보기로 하였다.

(위의 사진은 프로젝트의 top이 아닌 예시입니다!)

CPU 부하

우선적으로 위의 사진에서 load average는 해당 CPU에 어느정도로 부하가 일어나고 있는지를 말하며 CPU 하나의 프로세서당 load average :1 이라고 하였을 때 부하의 정도를 파악하는 용도로 사용한다. 3가지가 나와있는데 순서대로 1분 , 5분 15분 의 load average를 나타낸다. 하지만 load 값이 높다고 CPU 부하량과 비례하는 것은 아니다.
예를 들어 CPU 하는 작업 중에는 부하가 높지 않아도 처리 완료까지 오래 걸리는 작업이 있다. 예를들어 디스크 I/O가 있다.

memory 부하

CPU는 계산 처리는 엄청 빠르게 할 수 있지만 하드디스크에서 저장한 내용을 찾는 작업은 끝날때 까지 기다려야 한다. 또 한 CPU는 작업을 메인 메모리에서 하게 되는데 메모리에 새로운 공간이 없다면 OS는 메모리에서 최근에 사용하지 않은 메모리를 정리한다. 만약 최근에 사용하지 않은 것을 하드디스크로 옮겼는데 다시 해당 작업을 해야 하는 상태면 하드디스크에서 불러오는 작업을 해야 한다. 따라서 이런 swap 작업이 오래 되면 load 값이 증가하게 된다.

OOM Killer

앞에서 언급한 것 처럼 OS는 CPU가 작업을 하기 용이하게 하기 위해서 메모리를 벨런싱하는 작업을 하게 된다. 이 때 만약에 메모리에서 사용하지 않은 프로세스를 하드디스크에서 넣으려고 할 때 하드디스크가 꽉차게 되면 어떻게 될까?
이런 환경에서는 OS의 작동도 이상해 질 수 있으므로 강제로 프로세스를 종료 시키게 된다. 이 때 ssh를 OS가 종료하게 된다면 응답할 수 없는 상태가 되는 것이다.

다시 본론으로 들어가서 해당 사진에서 서버를 유지하기 위한 oracle이 CPU가 5.2라도 TIME이 긴 걸로 보아 이 부분에서 CPU를 많이 잡아먹는 것을 유추 할 수 있다.
만약 커멘드를 자세히 보고 싶다면 c 를 누르고, 만약 정지할 프로세스를 찾았다면 q를 누르고 sudo kill [PID] 로 제거하면 된다.

추가적으로 앞에서 CPU를 많이 잡아먹고 있는 orcle은 서비스이기 때문에 kill 을 하면 안된다.
더 자세히는 프로그램을 필요할 때 프로세스를 실행해서 처리가 끝나면 종료되는 것과
컴퓨터를 사용하는 동안 계속 프로세스를 실행해야 하는 프로세스가 있는데 이런 상주형 프로세스를 서비스라고 한다.
이런 서비스들은 sudo service apache2 restart 명령어로 다시 시작해 주어야 한다.

더 나아가서

head , tail 같은 파일의 내용을 출력하는 명령어도 있고 필자가 모르는 다른 좋은 명령어가 있으면 댓글로 알려주길 바란다 :)
더 나아가서 쉘 스크립트도 공부하고 나서 추가 작성하는 시간을 가질 예정이다.😀

profile
best of best

0개의 댓글