[Born2beRoot] 스크립트 작성 및 설정

bolee·2022년 4월 13일
0

42seoul

목록 보기
9/27

42seoul Born2beRoot 프로젝트 Mandatory에서 요구하는 스크립트 작성 및 설정 과정이다.

Subject의 내용

  • 서버 시작 시 스크립트는 10분마다 모든 터미널에 일부 정보를 표시해야 한다.
  • 배너는 선택 사항이며, 오류를 볼 수 없어야 한다.
  • 스크립트는 항상 다음 정보를 표시할 수 있어야 합니다.
  • 운영 체제의 아키텍처 및 커널 버전을 보여주어야 한다.
  • 물리적 프로세서의 수를 보여주어야 한다.
  • 가상 프로세서 수를 보여주어야 한다.
  • 서버의 현재 사용 가능한 RAM과 활용률을 백분율로 보여주어야 한다.
  • 서버의 현재 가용 메모리와 활용률을 백분율로 보여주어야 한다.
  • 프로세서의 현재 활용률을 백분율로 보여주어야 한다.
  • 마지막으로 재부팅한 날짜 및 시간을 보여주어야 한다.
  • LVM의 활성 여부를 보여주어야 한다.
  • 활성 연결 수를 보여주어야 한다.
  • 서버를 사용하는 사용자 수를 보여주어야 한다.
  • 서버의 IPv4 주소와 MAC(Media Access Control) 주소를 보여주어야 한다.
  • sudo 프로그램으로 실행된 명령의 수를 보여주어야 한다.

쉘 스크립트 작성

subject 내용에서 보여줘야 할 정보들을 보여줄 스크립트를 작성하면 아래와 같다.

printf "#Architecture: "
uname -a

printf "#CPU physical : "
nproc --all

printf "#vCPU : "
cat /proc/cpuinfo | grep processor | wc -l

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

printf "#Disk Usage: "
df -a -BM | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -a -BM | grep /dev/map | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "MB ("
df -a -BM | grep /dev/map | 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}'

printf "#Last boot: "
who -b | awk '{printf $3" "$4"\n"}'

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

printf "#Connections TCP : "
ss | grep -i tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"

printf "#User log: "
who | wc -l

printf "#Network: IP "
hostname -I | tr -d '\n'
printf "("
ip link show | awk '$1 == "link/ether" {print $2}' | sed '2, $d' | tr -d '\n'
printf ")\n"

printf "#Sudo : "
journalctl _COMM=sudo | wc -l | tr -d '\n'
printf " cmd\n"

uname: 시스템 정보 출력 명령어

  • -a: 커널 이름, 네트워크 호스트명, 커널 릴리즈 정보, 커널 버전, 시스템의 하드웨어 타입(아키텍쳐), 운영체제 이름을 출력한다.

nproc --all: 설치된 모든 코어 / 프로세스 수 출력

/proc/cpuinfo: CPU 정보가 담겨있는 파일
cat /proc/cpuinfo | grep processor | wc -l: CPU 정보가 담겨 있는 파일 중 프로세스만 찾아 개수를 출력

free: 시스템 메모리 사용 현황 출력 명령어

  • -m: 메가바이트 단위로 표시

df: 파일시스템 디스크 공간의 사용량을 출력하는 명령어

  • -a: 0 블록의 파일시스템을 포함해 모든 파일시스템을 출력하는 옵션
  • -B: 지정한 크기(SIZE)를 블록단위로 정하여 용량 표시하는 옵션
  • -BM: 크기를 1M으로 블록단위를 정해 용량을 표시

mpstat: 사용가능한 CPU와 Core 별 사용량을 출력하는 명령어 (sysstat 설치 필요)

who: 호스트에 로그인한 사용자 정보 출력

  • -b: 마지막 시스템 부팅 시간을 출력하는 옵션

ss: 소켓 상태를 조회할 수 있는 유틸리티로 netstat와 비슷한 역할을 수행한다.

hostname: 시스템 이름을 확인하고 설정하는 명령어

  • -I: 호스트의 IP 주소를 출력하는 옵션

ip: IP 유틸리티는 모든 최신 Linux 배포 환경에 설치된 iproroute2 패키지의 일부로, 인터페이스를 위/아래로 가져오고, 주소와 경로를 할당 및 제거하고, ARP 캐시를 관리하는 등 다양한 용도로 사용된다.

  • link: 네트워크 인터페이스를 표시하고 수정한다.
  • show: 관련 인터페이스 출력한다.

journalctl: systemd의 서비스 로그를 확인할 수 있으며, systemd-journald.service에 의해서 systemd의 정보들을 분석한다.

  • systemd: 일부 리눅스 배포판에서 '유닉스 시스템 V'나 'BSD init 시스템' 대신 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템
  • _COMM=sudo: 특정로그(sudo) 보기

쉘 스크립트 주기적 실행

이제 스크립트를 작성하였으니 서버 시작 시 스크립트는 10분마다 모든 터미널에 일부 정보를 표시하는 설정을 해준다. 이를 위해 아래 명령어를 입력한다.

chmod +x [쉘 스크립트 파일]
crontab -e

// 파일 편집기 선택 후 나오는 파일에서 아래 입력
*/10 * * * * /root/[쉘 스크립트 파일] | wall

chmod: 해당 파일에 대한 권한을 변경하는 명령어

  • +x: 해당 파일에 실행 권한을 줄 수 있는 명령어

crontab: 특정 파일을 주기적으로 실행 시킬 수 있는 프로그램

  • -e: 예약 파일을 편집할 수 있게 하는 명령어
  • crontab 기본 문법
     # 분 시 일 월 요 [실행할작업]
     
     # ┌───────────── 분 (0 - 59)
     # │ ┌────────────── 시 (0 - 23)
     # │ │ ┌─────────────── 일 (1 - 31)
     # │ │ │ ┌──────────────── 월 (1 - 12)
     # │ │ │ │ ┌───────────────── 요일 (0 - 6) (0이 일요일, 6이 토요일이다.)
     # │ │ │ │ │
     # │ │ │ │ │
     # * * * * *  [실행할작업]
    • 해당사항이 있는 자리에만 숫자를 적고 나머지는 * 그대로 표기
    • 요일의 경우 일요일이 0이고 토요일이 6인 점 주의
    • 아무것도 입력하지 않고 * * * * *으로 두면 매분 마다 실행
    • 주기를 입력할 땐 / 사용 (ex. /4로 4분마다, 4시간마다 등을 설정 가능)
    • 구간을 입력할 땐 -사용(ex. 4-5는 4부터 5까지라는 의미)
    • 쉼표(,)를 입력해 여러 시간을 동시에 입력 가능
    • 문법이 틀릴 경우 아래와 같이 메세지 출력됨 (아래의 경우 시간 부분이 잘못되었다는 의미)
      crontab: installing new crontab
      "/tmp/crontab.0doyEF":1: bad hour
      errors in crontab file, can't install.
      Do you want to retry the same edit?

wall: 모든 터미널에 메시지를 출력하는 명령어

실행 결과

0개의 댓글