가상 머신에서 시간대를 확인하고 시간대를 설정하는 방법
timedatectl list-timezones
위의 명령어는 설정 가능한 timezone의 리스트들을 읽어오는명령어에 해당한다. 우리가 알고 있는 시간대와 가상 환경에서 설정할 때의 시간대의 이름은 다르기 때문에 어떤 이름으로 시간대를 설정할 수 있는지를 확인해야 한다. 그냥 Seoul 로 설정하면 제대로 설정이 되지 않고 Asia/Seoul 로 설정해야만 한다.
sudo timedatectl set-timezone [시간대]
시간대를 파악했으면 시간대를 설정해주어야 한다. 이때 sudo를 이용하여 관리자의 권한을 통해서 설정을 해줘야 한다. sudo 를 뻬먹을 경우 제대로 실행이 되지 않기 때문에 반드시! 앞에 sudo를 붙여줘야 한다. 리눅스의 환경에서 뭔가 할때 sudo를 빼먹으면 원하는 결과 값이 나오지 않기 때문에 꼭 기억해야 한다!
date // Tue Jul 16 13:34:16 KST 2024 -> 이와 같이 출력 되었다면 성공이다!!
mpstat
쉘 코드 작성
#!/bin/bash
위의 코드를 스크립트 파일의 가장 첫 줄에 입력함으로써 스크립트를 어떤 인터프리터를 사용할 것인지 지정해주는 역할을 한다. 여기서는 Bash shell을 사용하도록 지정하는 역할을 수행한다. 그리고 이러한 쉘 선언문을 Shebang이라고 한다.
쉘 스크립트를 이용하여 정보 얻어오기
CPU의 사용량 읽어오기
cpu의 사용량을 읽어올 수 있는 명령어는 여러가지가 있었다. 그 중에서도 대표적인 명령어 몇개를 학습하였다.
top
mpstat
top
명령어의 경우 추가적인 도구 설치가 필요하지 않고 바로 프롬프트에서 사용이 가능합니다. 하지만 mpstat
의 경우 추가적인 도구 설치가 필요합니다. sudo apt install sysstat
도구를 설치하여 사용이 가능합니다.sysstat은 리눅스의 성능 측정 도구 패키지입니다. 해당 패키지를 cpu의 지표를 측정하는 것 뿐만이 아니라 특정 프로세스의 정보다, dist io의 지표를 측정하는 방법으로 사용이 가능합니다. 여기서 dist의 io란 Dist의 Input/Output의 약자로 디스크에서 읽어나는 읽거나(read) 쓰는(write) 작업을 이야기합니다.
위의 명령어 중
mpstat
이 보기에 더 좋습니다.Linux 5.15.153.1-microsoft-standard-WSL2 (sunubdesktop) 07/16/24 _x86_64_ (2 CPU)
16:56:45 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
16:56:46 all 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
Average: all 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
mpstat을 이용하여 cpu의 사용 정보를 읽어올 수 있는 방법은
mpstat 1 1
명령어를 이용하는 것입니다. 쉘 스크립트에서 사용되는 명령어들은 띄어쓰기를 기준으로 모든 옵션을 구분합니다. if
절을 예로 들어 설명해보겠습니다.if[someConditoin] # 잘못된 사용법
if [ someCondition ] # 옯바른 사용법
위에서 살펴볼 수 있듯이 쉘 스크립트에서 띄어쓰기는 굉장히 중요한 역할을 합니다. 보통 쉘 스크립트는
명령어 옵션1 옵션2 타켓
와 같이 띄어쓰기를 기준으로 수행하는 기능이 변경되기 때문입니다.앞서 설명했던
mpstat 1 1
의 경우 [CPU의 사용량을] [1초동안] [1번만 출력]
의 의미로 사용됩니다.출력 데이터 활용하기
Linux 5.15.153.1-microsoft-standard-WSL2 (sunubdesktop) 07/16/24 _x86_64_ (2 CPU)
16:56:45 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
16:56:46 all 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
Average: all 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
위와 같이 출력 된 데이터 중 Average 데이터를 읽어오기 위해서는 어떻게 해야 할까요?
awk
명령어를 활용하면 읽어올 수 있습니다!awk '/Average:/ {print $NF}'
위의 명령어를 해석해보겠습니다. awk는 출력되거나 특정 파일에 있는 텍스트를 필터링하는 역할로 사용이 됩니다. 그 다음에 있는
/Average:/
는 특정 레코드를 읽어오는데 사용이 됩니다. 여기서 레코드는 각 줄을 쉘 스크립트에서는 레코드라고 표현을 합니다. 그리고 이후의 {print $NF}
의 경우 field를 선택하기 위한 용도로 사용되는 명령어 입니다.여기서
{}
의 역할이 궁금하실 것 같습니다. 중괄호의 역할은 액션 블록을 정의합니다. 액션 블록은 수행할 작업을 정의합니다. 예를들어 보겠습니다.awk '{print $1}' file.txt # 모든 라인의 첫 번째 필드 출력
awk '/pattern/ {print $0}' file.txt # 'pattern'이 있는 라인 전체 출력
이와 같이 특정한 기능을 수행할때
{}
로 묶어서 사용합니다. 또한 이러한 조건들 특수기호가 들어가는 경우는 ‘’
로 묶어줘서 쉘 스크립트가 잘못해석하는 것을 방지해주기 위한 용도로 사용이 됩니다.변수 선언하기
memory_info=(free -m | awk '/^Mem:/ {print $2","$3}')
used=11
useage_percent=$((used * 100) / total)
name="something"
pass=1234
쉘 스크립트에서 변수를 선언할 때는 여러 특징이 있습니다. 우선 쉘 스크립트에서 선언하는 모든 변수의 값을 문자열로 저장이 됩니다. 위의 pass에 선언한 1234 도 문자열로 값이 저장이 됩니다. 그렇기에 변수에는 특정한 자료형을 기입하지 않습니다. 그리고 특정 값을 사용하기 위해서는 특수문자
$
를 사용해주어야 합니다.예를 들어
useage_percent=$((used * 100) / total)
는 used
변수를 사용하기 때문에 변수 선언시 달러 문자를 사용하여 번수 선언을 해주었습니다. 또한 변수 선언시 변수이름과 값사이의 =
에는 공백이 있으면 안됩니다.그리고 마지막으로
()
는 명령 치환을 위해서 사용됩니다. 이 말의 의미는 free -m | awk '/^Mem:/ {print $2","$3}'
의 결과 값, 이 경우 메모리 출력 값중 Mem을 시작으로 하는 2, 3번째 필드의 값을 하나의 문자열로 묶어서 변수 선언을 해주는 것입니다. 예를 들어 memory_info=("16000,4000")
로 사용이 되는 것입니다.쉘 스크립트를 이용하여 HTTP 요청하기
curl -X POST -H 'Content-type: application/json' --data '{"text":"J041 CPU is now ALARM: usage is over 70%"}' https://hooks.slack.com/services/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
curl
은 client URL을 의미합니다. URL 데이터를 전송하여 서버에 데이터를 전송하거나 가져올 경우 사용되는 명령어 입니다. 이 뒤의 -X
플래그는 Explict를 의미합니다. 여기서의 의미는 여러 HTTP 메소드 중 하나를 선택하는 용도로 사용되는 플래그입니다. 위의 명령어에서는 POST
메소드를 선택하겠다는 의미입니다. 그 후로 등장하는 -H
는 헤더 설정을 의미합니다. 전송하는 데이터의 헤더를 'Content-type: application/json'
와 같이 설정하여 데이터를 요청하는 것입니다.—data
의 경우 POST의 Body 데이터에 해당 합니다. 어떤 데이터를 보낼 것인지 추가한 것이며 '{"text":"J041 CPU is now ALARM: usage is over 70%"}'
데이터를 보내겠다는 것을 뜻합니다. 그리고 가장 마지막에 있는 URL은 데이터를 요청하고자 하는 URL 정보에 해당합니다.쉘 리다이렉션
CURRENT_DIR="/home/sunub/works/boostcamp/day-02"
MONITORING_DIR="${CURRENT_DIR}/monitoring"
LOG_FILE="/home/sunub/cron_error.log"
{( echo "Hello World!" )} > "${MONITORING_DIR}/${FILENAME}"
{( echo "Hello World!" )} < "${MONITORING_DIR}/${FILENAME}"
>
는 출력을 담당하는 리다이렉션 입니다. 여기서 > 왼쪽에 있는 명령어의 출력 값을 오른쪽에 있는 파일로 전달하고 오른쪽에 위치한 위치에 특정 폴더와 파일을 생성하는 역할을 수행합니다.grep
grep "search_term" < large_file.txt
grep은 특정 파일에서 지정한 문자열이나 정규 표현식을 포함한 행을 출력해주는 명령어이다. 파일 내에 특정한 문자열이 있는지 찾는 역할을 수행합니다. 여기서
<
를 이용하여 large_file.txt
파일을 읽어 옵니다. 그리고 읽어온 파일의 결과 값 중 "search_term"에 해당하는 단어가 있을 경우 해당 단어를 강조하여 출력하는 역할을 수행합니다.SSH
다른 동료분들이 작성하신 것을 보니 나는 이것을 제대로 짚고 넘어가지 않았다는 것을 깨달았다. 초기에 리눅스 환경을 설치할때 로컬에 설치되어 있는 SSH 키를 읽어오고 새롭게 계정을 만들고 github 계정을 연결하는 단계를 거쳐서 이 과정이 SSH를 연결하는 것을 뜻하는 것이라고 미션을 생각했는데 다른 분들의 저장소를 보니 이미 만들어진 ROOT 계정 내에서 새로운 계정을 만들고 해당 계정이 리눅스 환경에서 계정을 만들고 해당 계정을 SSH를 통해서 이용을 가능하게 하고 폴더에 권한을 주는 과정을 줬어야 하는 것을 깨달았다… 제대로 구현하지 않고 결과 제출 시 SSH 연결을 시도 했다고 체크했는데 반성하게 되었다. 그래서 SSH에서 다시 제대로 정리하고 넘어가기로 했다.