밥한그릇배따시게
SW 개발자 블로그
밥한그릇배따시게
전체 방문자
오늘
어제
  • 분류 전체보기 (76)
    • Notice (공지) (2)
    • IT (58)
      • 학과 공부 (13)
      • Algorithm (1)
      • 42Seoul (20)
      • 데이터 과학 & 인공지능 (5)
      • go 언어 (3)
      • 블록체인 (2)
      • 왕초보 강의 (5)
      • ETC (4)
    • About Me (10)
      • 회고록 (6)
      • 일상 (4)
    • English (6)
      • 회화 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • IT
  • 영어
  • til
  • c언어
  • FD
  • 영어표현
  • 컴퓨터공학
  • 42seoul
  • 회화
  • 계절학기
  • 42본과정
  • 운영체제
  • vscode
  • 스피킹
  • parser
  • Github
  • 전공공부
  • m1
  • GIT
  • KOCW
  • GNL
  • 오류
  • 영어공부
  • get_next_line
  • 온라인 어학연수
  • 컴파일러
  • 왕초보
  • Libft
  • cqu
  • 라이브러리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
밥한그릇배따시게

SW 개발자 블로그

[born2beroot] monitoring 파트 정리2
IT/42Seoul

[born2beroot] monitoring 파트 정리2

2021. 11. 17. 23:24

[평가시트 원문] 더보기

더보기

Script monitoring

Remember: Whenever you need help checking something, the student being evaluated should be able to help you. The student being evaluated should explain to you simply:

  • How their script works by showing you the code.
  • What "cron" is.
  • How the student being evaluated set up their script so that it runs every 10 minutes from when the server starts. Once the correct functioning of the script has been verified, the student being evaluated should ensure that this script runs every minute. You can run whatever you want to make sure the script runs with dynamic values correctly. Finally, the student being evaluated should make the script stop running when the server has started up, but without modifying the script itself. To check this point, you will have to restart the server one last time. At startup, it will be necessary to check that the script still exists in the same place, that its rights have remained unchanged, and that it has not been modified. If something does not work as expected or is not clearly explained, the evaluation stops here.Bonus

Evaluate the bonus part if, and only if, the mandatory part has been entirely and perfectly done, and the error management handles unexpected or bad usage. In case all the mandatory points were not passed during the defense, bonus points must be totally ignored.

 

Script monitoring

 

피평가자는 당신에게 다음의 내용들을 간단히 설명해야합니다 :

  • 스크립트가 어떻게 동작하는 지 당신에게 코드를 보여주기
  • "cron"이란 무엇인지
  • 피평가자가 어떻게 스크립트를 설정했길래 그게 (서버가 시작된 이후로) 10분마다 한번씩 실행되는지

일단 스크립트가 올바른 동작을 한다는 게 검증되고 나서는, 피평가자는 그 스크립트가 매분마다 실행되도록 해야합니다. 그 스크립트가 동적인 값들과 함께 올바르게 작동한다는 것을 보장하기 위해서, 당신은 원하는 무엇이든 실행시킬 수 있습니다. 최종적으로, 피평가자는 그 스크립트가 스스로를 수정하지 않고도 서버가 시작되면 실행을 멈추게끔 만들어야합니다. 이 점을 확인하기 위해서는, 당신은 마지막으로 한번 서버를 재시작해야 할 것 입니다. 막 시작되었을 때, 그 스크립트가 아직 같은 장소에 존재하는 지, 권리(권한)가 바뀌지 않은 채로 남아있는지, 그리고 수정되지 않았는 지 반드시 확인해야합니다.

 


3. 스크립트 설명

 

 

출력결과가 이렇게 나오도록 하려면, 어떻게 스크립트를 만들어야할까?

 

#!/bin/bash_

printf "#Architecture: "
 uname -srvmo 
 # 시스템 정보 확인

printf "#CPU physical : "
 nproc --all
 # 물리적 cpu의 개수 확인
 
 
printf "#vCPU : "
 cat /proc/cpuinfo | grep processor | wc -l
 # 가상머신에 할당된 물리적 CPU의 개수 확인

printf "#Memory Usage: "
 free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
 # 메모리 점유율 확인

printf "#Disk Usage: "
 df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
 df -H -a | grep /dev/mapper/ | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "GB ("
 df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4 }END{printf "%d", sum1 / sum2 * 100}' | tr -d '\n'
printf "%%)\n"
 # 디스크의 공간 및 디스크 사용률 확인

printf "#CPU load: "
 mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'
 # CPU 사용률 확인
printf "#Last boot: "
 who -b | sed 's/^ *system boot //g'
 # 마지막으로 시스템 부팅한 시간 확인
printf "#LVM use: "
 if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi
 # LVM이 사용되었는 지 여부 확인
printf "#Connections TCP : "
 ss | grep -i tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"
 # TCP 연결을 확인
printf "#User log: "
 who | wc -l
 # 현재 로그인 중인 이용자의 수를 확인
printf "#Network: IP"
 /sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'

printf " ("
 /sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'
printf ")\\n"
 # 현재 ip주소와 mac주소 확인
printf "#Sudo : "
 grep -a 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'
printf " cmd\n"
 # sudo 명령어 사용 횟수 확인
exit 0

 

 

참고) 쉘 기본 명령어

더보기

(1) grep : 입력으로 전달된 파일의 내용에서, 특정 문자열을 찾고자할 때 사용

$ grep [OPTION] [PATTERN] [FILE]

예시 : grep "Apple" -> "Apple"이라는 문자열을 검색하고, 문자열이 존재하는 라인을 출력

 

 

(2) wc : word count, 문자/단어/줄 수 등을 출력

wc -l : 지정한 파일의 줄 수(line) 출력, 행수(row) 출력

응용 : grep "A" | wc -l

  -> "A"라는 문자열이 포함된 문장의 개수를 센다.

 

 

(3) awk : 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작화하거나 데이터화

 데이터 분류, 패턴 매칭 검사, 데이터 조작 및 연산 등의 액션 수행, 그 결과를 출력

 

$ awk [OPTION ...] [awk program] [ARGUMENT ...]

awk program 의 구조 -> pattern {action}

$ awk [OPTION ...] 'pattern {action}' [ARGUMENT ...]

 - pattern, action 모두 생략 가능 (생략 시 디폴트 : pattern - 모든 레코드, action - print)

 

* 특별한 패턴 : "BEGIN", "END"

 - awk가 BEGIN 패턴을 식별하면 입력데이터로부터 첫 번째 레코드를 처리하기 전에 "BEGIN"에 저장된 액션을 실행

- "END" 패턴은 "BEGIN"과 반대로, 모든 레코드를 처리한 다음 "END"에 지정된 액션을 실행

 

예시 :

$ awk 'BEGIN { print "TITLE : Field value 1,2"} {print $1, $2} END {print "Finished"}' file.txt

* printf 와 print의 차이점 : printf와 다르게, print는 개행까지 출력한다. 만일 개행을 빼고 싶다면 tr -d '\n'  명령어를 추가해줘야한다.

 

(4) tr : 문자 변환/삭제

 지정한 문자를 변환하거나 삭제하는 데 사용되는 명령어. 특정한 문자를 다른 문자로 변환하거나 특정 문자를 제거하는 데 사용.

 

$ tr [옵션] 문자열1 [문자열2]

 

옵션 : 

 -d : 문자열1에서 지정한 문자를 삭제

 -s : 문자열2에서 반복되는 문자를 삭제

 -t : 문자열1을 문자열2의 길이로 자름

 

(5) sed : Stream Editor. 원본 텍스트 파일을 편집하는 명령어 (치환, 삭제 등)

 

- sed 's/문자열1/문자열2/g' : 출력 중 문자열1이 나오는 부분을 전부 문자열2로 치환한다. 

 

 

(6) 조건문


 1) if 문

if [ 조건절 ]
then
    실행절
fi

 

2) if-else 문

if [ 조건절 ]
then
    실행절
else
    실행절
fi

 

 3) if-elif-else 문

if [ 조건절 ]
then
    실행절
elif [ 조건절 ]
then
    실행절
else
    실행절
fi

 

 

6. #CPU load : CPU 사용률 확인

mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'

- cpu 사용량을 

 

mpstat :  리눅스 CPU 사용량, 코어 별 사용률을 확인할 수 있는 명령어

 

- mpstat 만 실행 시, 1회에 한하여 CPU 사용률을 보여준다 (전체 코어 한번에)

mpstat 명령어 실행 결과

mpstat을 통해 나온 결과 중, all(모든 cpu)이 나온 줄만 가져온다. 그리고 100에서 %idle (13번째 열)을 뺀 값 (= 현재 cpu 사용량)을 계산하여 출력한다.

 

* all : 모든 CPU

* %idle : 유휴한 CPU 시간 백분율 (유휴 시간)

 

- system idle 프로세스?

 각 CPU마다 하나씩 실행되는 스레드로서, CPU의 잔여 프로세스 처치량을 %로 나타낸 값.

 쉽게 얘기하면 '놀고있는 CPU'

 ex) 이 값이 95라면, 현재 5%의 CPU가 사용되고 있으며 나머지 95%는 쉬고 있음을 뜻함

 

-> 현재 CPU 사용량 = 100% - system idle 프로세스

 

 

참고) mpstat의 각 열 항목에 대한 설명

더보기

https://blueyikim.tistory.com/555

 

[명령어] mpstat 설명

서버 시스템 사양은 여러개의 CPU와 Core를 가지고 있다. 이때 사용가능한 CPU와 Core 별로 사용율을 모니터링할 때 사용되는 명령어가 mpstat이다. mpstat는 레드햇 계역 리눅스에서는 sysstat 패키지를

blueyikim.tistory.com

 

** 설치 : 

  • 데비안 계열(우분투 등) : apt-get install sysstat
  • 레드햇 계열(페도라, CentOS 등) : yum install sysstat

참고) mpstat에 대한 더 자세한 정보

더보기

https://harryp.tistory.com/1042

 

[Linux] mpstat - 리눅스 CPU 사용량, 코어 별 사용률 확인

안녕하세요. 업무를 수행 하다 리눅스 서버의 CPU 코어 별 사용량을 파일로 뽑아야 됐습니다. top로는 관련 작업이 어려워 찾아보던 중, mpstat 이란 명령어를 알게되어 공유해봅니다. 1. 설치 mpstat

harryp.tistory.com

 

 

 

7. #Last boot : 마지막으로 시스템 부팅한 시간 확인

who -b | sed 's/^ *system boot //g'

 

who : 현재 로그인하고 있는 사용자들의 정보를 출력하는 명령어

 

-b 옵션 : 마지막으로 시스템을 부팅한 시간

 

참고) 더 많은 who 옵션

더보기

https://shaeod.tistory.com/623

 

[리눅스 명령어] who - 호스트에 로그인한 사용자 정보 출력

※ 요약 리눅스 명령어 who는 호스트에 로그인한 사용자의 정보를 출력하는 명령어이다. who명령어는 현재 접속한 사용자 정보를 /var/run/utmp 파일에서 가져오며, 이 utmp파일은 사용자가 원격으로

shaeod.tistory.com

 

 

who와 who -b를 실행했을 때의 결과

who -b를 통해 가장 마지막으로 시스템을 부팅한 시간을 받아올 수 있다.

이떄 '~systemboot  '을 제거하고 부팅시간만 나오게하기 위해서 sed 's/^ *system boot //g'으로 출력을 편집해준다.

 

 

 

 

8. #LVM use : LVM이 사용되었는 지 여부 확인

if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi

 

- lsblk : 라뉵스 디바이스 정보를 출력하는 명령어. (옵션없이 사용할 시, 트리 형식으로 모든 스토리지 디바이스를 출력)

- '-gt' 옵션 : 비교연산자 (보다 큼).

    ex) if [$a -gt $b]

 

type에서 lvm이 나온 개수를 세니까 3이 나온다.

여기 lsblk를 실행하여 나오는 결과에서, lvm이 나온 줄만 뽑아 그 개수를 센다 (grep lvm | wc -l)

그리고 그 개수가 0보다 크면 lvm이 사용된 것으로 간주하고 yes를 출력한다. 그렇지 않으면 no를 출력한다.

 

참고) 쉘스크립트에서 사용하는 비교연산자 정리

더보기

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mmarine&logNo=70094622832 

 

Bash Script에서 사용하는 비교 연산자 정리

Bash Script에서 자주 사용하는 비교 연산자 [ 정수 비교 ] 연산자 의미 표현 -eq (같음) if [ $a -eq $b...

blog.naver.com

 

 

 

 

 

9. #Connections TCP : TCP 연결(개수)을 확인

ss | grep -i tcp | wc -l | tr -d '\n'

 

- ss : 네트워크 상태를 확인하기 위해 사용하는 명령어

ss 명령어를 실행하면 나오는 화면

이때, tcp가 나온 줄의 개수를 세기위해 grep -i tcp | wc -l 를 실행한다. 그리고 개행을 제거하여 출력한다.

(grep에 -i 옵션을 준 이유는 대소문자 구별없이 tcp라는 문자를 찾기위함)

실행 결과 화면

 

 

 

10. #User log : 현재 로그인 중인 이용자의 수를 확인

who | wc -l

who 라는 명령어는 현재 시스템에 로그인 되어있는 유저들에 대한 정보를 출력한다.

따라서 who | wc -l 명령어를 통해, who에서 나오는 출력의 줄 수를 센다. 이것이 바로 유저의 수가 된다.

 

 

 

 

11. #Network: IP : 현재 ip주소와 mac 주소 확인

 

ifconfig 명령어 실행화면
빨간색 - ip 주소, 파란색 - mac 주소

 

** ifconfig 명령어를 설치하지 않고 실행하면, 'command not found'라는 오류 메시지가 뜬다.

** ifconfig 설치 (우분투, 데비안)

$ sudo apt-get install net-tools

참고) centOS에서 ifconfig 설치

더보기
$ sudo yum install net-tools

 

 

 (1) /sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'

 

 - ip 주소 출력

캡쳐본에서 빨간색으로 표시한 부분을 출력해야한다. 따라서 이에 맞게 문자열을 편집하여 출력하는 작업이 필요하다.

 

해당 줄에 broadcast가 있으므로, grep broadcast를 실행해서 그 줄을 불러온다. 그리고 sed와 tr-d를 이용해서 ip주소 앞뒤의 문자열들을 지워 ip주소만 남긴다.

 

(sed 's/inet//g'를 이용해서 ip주소 앞의 문자열을 지운다. 그리고 sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'을 실행해서 뒤에 있는 문자열도 지워준다. 그러면 ip주소와 개행만 남는다. 이때 tr -d '\n'를 통해 개행을 지워주면 끝이다)

 

 

 (2) /sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'

 

- mac 주소 출력

캡쳐본에서 파란색으로 표시한 부분을 출력해야한다.

mac 주소 앞에 'ether '가 있으므로 grep을 통해 그 줄을 가져올 수 있다. 그리고 sed와 tr -d 를 통해 문자열을 편집해서, mac주소만 남겨서 출력하면 된다.

 

 

 

 

참고) 명령어 : ifconfig와 ip 비교

더보기

https://www.leafcats.com/169

 

리눅스 ip 확인 : ifconfig / ip addr show 차이

서버용 OS로 많이 사용되는 리눅스에서는 ip 등 네트워크 설정 정보가 매우 중요하다. 리눅스 네트워크 설정에 대한 가장 첫 단계는 ip 주소와 같은 네트워크 설정을 확인하는 것이다. 리눅스에서

www.leafcats.com

 

 

 

 

12. #Sudo : sudo 명령어를 사용한 횟수를 확인

grep 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'

 

- /var/log 디렉토리에 있는 리눅스 로그 파일

- /var/log/auth.log : 사용자 로그인이나 사용된 인증방법같은 시스템 인증 정보가 기록된다.

 

sudo 관련 명령어를 사용한 후, 위와 같은 쉘 명령어를 이용하여 변화를 확인하였다

sudo ufw status 명령어를 한번 사용할때마다 결과값이 1씩 증가하는 것을 볼 수 있다.

 

 

추가)

💡 grep 에 -a 옵션을 추가했다! (이거 안해서 리트함...)

 

grep 때문에 리트하게 되는 사태가 발생했다... 당연히 grep이 잘 될 줄 알았는데, sudo 명령어 시행 개수가 출력이 0으로 고정되서는 뭘해도 변하지 않았다. 그 전에는 해당 코드가 잘 돌아갔는데... 갑자기 명령어가 먹히지 않는 이유를 알 수가 없었다.

알고보니 로그 파일에 binary 문자가 존재해 grep이 제대로 되지않아 발생하는 증상이었다. 이때 뒤에 -a (또는 -text)를 붙이면 grep이 잘 되는 것을 확인할 수 있다.

 

 

 


4. 스크립트가 매분마다 실행되도록 만들기

 

참고) 크론탭 사용방법

더보기

https://jdm.kr/blog/2

 

리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog

* 이 포스팅은 네이버 블로그에서 작성(2013.04.01)한 내용을 옮겨온 것입니다. 오늘은 리눅스 크론탭에 대해 알아볼까 합니다. 음, 윈도우에서는 스케줄러와 비슷하다고 보면 되겠네요. "특정 시간

jdm.kr

 

 

10분마다 스크립트 실행 : 

  • sudo crontab -e
  • */10 * * * * /monitoring.sh | wall
  • */10 * * * * bash monitoring.sh | wall

 

매분마다 스크립트 실행 :

  • sudo crontab -e
  • * * * * * /root/monitoring.sh

 

초단위로 컨트롤 하려면

-> sleep []; 명령어

 

30초마다 실행하는 경우의 예시

 

 


5. 스크립트를 수정하지 않고도 실행을 멈추게 만들기

 

- 이 점을 확인하기 위해서는, 마지막으로 한번 서버를 재시작한다.

- 막 시작되었을 때, 그 스크립트가 아직 같은 장소에 존재하는 지, 권리(권한)가 바뀌지 않은 채로 남아있는 지, 그리고 수정되지 않았는 지 반드시 확인해야 한다.

 

crontab -e 에서 해당 파일을 삭제하거나, crontab -r 를 사용, 해당 스크립트를 크론탭에서 삭제해버리면 된다

(단, monitoring.sh 수정하지 않은 상태에서)

 

 

 

 

 

참고자료 링크

더보기

https://harryp.tistory.com/1042

 

[Linux] mpstat - 리눅스 CPU 사용량, 코어 별 사용률 확인

안녕하세요. 업무를 수행 하다 리눅스 서버의 CPU 코어 별 사용량을 파일로 뽑아야 됐습니다. top로는 관련 작업이 어려워 찾아보던 중, mpstat 이란 명령어를 알게되어 공유해봅니다. 1. 설치 mpstat

harryp.tistory.com

https://gbworld.tistory.com/1102

 

system idle process(시스템 유휴시간 프로세스) 정체

system idle process(시스템 유휴시간 프로세스)는 악성코드나 바이러스는 아니며, 각 CPU마다 하나씩 실행되는 스레드로서 CPU의 잔여 프로세스 처치량을 %로 나타난 값입니다. 쉽게 얘기하면 '놀고 있

gbworld.tistory.com

https://hand-over.tistory.com/45

 

ifconfig 설치하기 - Ubuntu, CentOS

안녕하세요. CentOS, Ubuntu 최초 설치하고 나서 특정 버전 이후는 ifconfig 명령어가 설치되어있지 않습니다. (ifconfig 명령어를 입력하면 'Command not found'가 출력됨) ifconfig를 사용하지 않고 IP 주소를..

hand-over.tistory.com

https://newstars.cloud/427?category=320059 

 

Linux 명령어 ss (Socket Statistics)

리눅스에서 네트워크 상태를 확인하기 위해 흔히 사용하는 명령어로는 netstat 를 들수 있는데, 대체 명령어로 ss도 사용할 수 있다. CentOS 6.x x64 에서 가능하니 참고! #ss [옵션] [필터] -a : 모든 포트

newstars.cloud

 

저작자표시

'IT > 42Seoul' 카테고리의 다른 글

[born2beroot] monitoring 파트 정리1  (0) 2021.11.17
[born2beroot] 개념 정리 - 프로젝트 개요  (0) 2021.11.15
[GET_NEXT_LINE] 구현 예시  (0) 2021.06.11
[GET_NEXT_LINE] 구현 준비  (0) 2021.06.04
Libft 과제 시 유의점 (테스터기, protected, Makefile)  (0) 2021.05.31
    'IT/42Seoul' 카테고리의 다른 글
    • [born2beroot] monitoring 파트 정리1
    • [born2beroot] 개념 정리 - 프로젝트 개요
    • [GET_NEXT_LINE] 구현 예시
    • [GET_NEXT_LINE] 구현 준비
    밥한그릇배따시게
    밥한그릇배따시게
    공부하고 정리한 내용 중, 공유할만한 내용들을 포스팅합니다. / 소프트웨어 학사 (2025년도 2월 졸업)

    티스토리툴바