(리눅스 운영체제) 07. 서비스 관리

# 학습 목표

  • 서비스 관리
    • 시스템 관리자가 하는 일을 이해할 수 있습니다.
    • 사용자 및 루트 권한을 이해하고 사용자 및 그룹을 관리할 수 있습니다.
    • 파일 권한을 변경하고 관리할 수 있습니다.
    • 프로그램과 프로세스의 차이점을 이해하고 프로세스를 검사/종료할 수 있습니다.
    • 백그라운드 프로세스 및 서비스를 이해하고 관리합니다.
    • cron 및 bash 스크립트로 자동화할 수 있습니다.


# 학습 콘텐츠

1. 악마와 서비스

  • 악마와 서비스
    악마 서비스
    – Linux 환경에서 시스템 초기화 후 init이라는 특수 프로그램에 의해 백그라운드에서 자발적으로 실행되는 프로그램
    – 백그라운드에서 실행 중인 프로세스를 나타내는 데 자주 사용됨
    (예) syslogd 및 httpd와 같이 프로그램 이름 끝에 d가 있는 프로세스
    – 당신이 무엇을
    > 하드웨어 장치 관리
    > 보조 저장 장치 및 디렉터리 연결(마운트)
    > 네트워크를 통한 프로세스 간 통신(소켓)
    > 애플리케이션 수준 서비스 제공
    – 운영 체제의 관점
    – 데몬의 역할에 따라 응용 계층 서비스를 간략하게 참조하십시오.
    – 사용자 보기
  • 일반적인 데몬의 예: 웹 서버(httpd)
    • (교육) 간단한 HTML 파일을 만들고 웹 서버에서 실행한 다음 crul이라는 유틸리티를 사용하여 주소에 연결합니다.
# index.html 파일 생성
roheerumi@devops:~/devops$ echo "<html><body><h1>roheerumi test</h1></body></html>" > index.html

# 웹 서버 실행 후 8888 포트 오픈
roheerumi@devops:~/devops$ busybox httpd -h . -p 8888 # 각종 유틸리티를 담은 리눅스용 애플리케이션

# 웹 서버 접속
roheerumi@devops:~/devops$ curl http://localhost:8888
<html><body><h1>roheerumi test</h1></body></html>

# 프로세스 확인 명령으로 httpd 데몬 작동 여부 확인
roheerumi@devops:~/devops$ ps aux | grep httpd
roheeru+    3659  0.0  0.0   2428    72 ?        Ss   11:21   0:00 busybox httpd -h . -p 8888
roheeru+    3665  0.0  0.0  18992   712 pts/1    R+   11:21   0:00 grep --color=auto httpd

# PID로 해당 데몬 kill
roheerumi@devops:~/devops$ kill -9 3659

# 해당 웹서버 접속 실패
roheerumi@devops:~/devops$ curl http://localhost:8888
curl: (7) Failed to connect to localhost port 8888: 연결이 거부됨

2. 일반적인 데몬: cron

  • 대표 데몬 예시: 크론 데몬
    • 일정에 따라 백그라운드에서 작업을 실행하기 위한 도구
    • crontab 사용을 위한 구문:
      사용하는 방법 의미
      분/시/일/월/일/일 – 분: 0~59분으로 표현
      – 시 : 0 ~ 23시간으로 표현
      – 일수 : 1~31일
      – 월 : 1월~12월로 표현
      – 요일 : 0(일요일) ~ 6(토요일)으로 표현
      > *: 시간을 표현하는 모든 필드는 *로 표현할 수 있으며, 이 경우 모든 시간을 의미합니다.
      > /간격: 모든 간격 표시
      – 동작: 절대 경로 지정과 필수 옵션 및 인수로 지정된 시간에 수행할 동작을 나열합니다.
    • 적용 예 의미
      0 1 * * * Batch.sh 매일 오전 1시에 batch.sh 실행
      0 8-10 * * * 배치.sh 매일 08:00부터 10:00까지 batch.sh 실행
      0 1,2,5 * * * Batch.sh 매일 01, 02, 05에 batch.sh 실행
      */5 * * * * 배치.sh batch.sh는 5분마다 실행됩니다.
    • (연습) 1분마다 날짜와 시스템 가동 시간을 파일에 기록
# 크론탭에 스케쥴 등록
roheerumi@devops:~/devops$ crontab -e # edit 크론탭 파일 수정
no crontab for roheerumi - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 (1): 1 # nano 에디터로 등록

# 등록 내용 * * * * * echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log

# 정상적으로 크론탭 등록
crontab: installing new crontab

# 로그 기록 중 확인
roheerumi@devops:~/devops$ cd ..
roheerumi@devops:~$ ls
devops  uptime.log  공개  다운로드  문서  바탕화면  비디오  사진  음악  템플릿
roheerumi@devops:~$ tail -f uptime.log 
2023. 03. 13. (월) 11:25:01 KST - 11:25:01 up 26 min, 1 user, load average: 0.06, 0.16, 0.18
2023. 03. 13. (월) 11:26:01 KST - 11:26:01 up 27 min, 1 user, load average: 0.02, 0.12, 0.17

# 등록한 크론탭 삭제
roheerumi@devops:~$ crontab -r # remove, 크론탭 삭제
roheerumi@devops:~$ crontab -l # list, 크론탭 확인
no crontab for roheerumi

3. 서비스 관리(systemctl)

  • systemctl
    • 모든 데몬을 나열하는 명령
      사용하는 방법 의미
      systemctl –type=(유형 이름) –type=(유형 이름): 유형과 일치하는 서비스만 표시합니다.
      (예) systemctl –type=service : 서비스 목록만 출력
      systemctl 목록 단위 파일 설치된 장치(데몬)의 출력.
      Systemctl 활성화 단위 이름 부팅 시 장치 활성화
      systemctl 비활성화 단위 이름 장치 시작 시 비활성화
      시작 systemctl 단위 이름 장치를 즉시 활성화
      중지 systemctl 단위 이름 기기를 즉시 비활성화
      시스템 재시작 단위 이름 기기를 즉시 재부팅
      Systemctl 상태 단위 이름 장치 상태, 마지막 로그 쿼리

! 액션 포인트!
Q. 로그에 따르면 cron 데몬이 최근에 실행한 명령은 무엇입니까? CMD 명령 실행(echo $(/bin/date) – $(/usr/bin/uptime) >> ~/uptime.log)

Q. 서비스를 다시 실행하려면 어떤 다른 명령을 사용해야 합니까?

# Q1. 크론 로그 확인
roheerumi@devops:~$ systemctl status -l cron # cron 데몬의 로그 확인
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-03-13 10:58:50 KST; 42min ago
       Docs: man:cron(8)
   Main PID: 602 (cron)
      Tasks: 1 (limit: 4615)
     Memory: 500.0K
     CGroup: /system.slice/cron.service
             └─602 /usr/sbin/cron -f

 3월 13 11:25:01 devops CRON(3700): (roheerumi) CMD (echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log)
 3월 13 11:25:01 devops CRON(3699): pam_unix(cron:session): session closed for user roheerumi
 3월 13 11:26:01 devops CRON(3736): pam_unix(cron:session): session opened for user roheerumi by (uid=0)
 3월 13 11:26:01 devops CRON(3737): (roheerumi) CMD (echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log)
 3월 13 11:26:01 devops CRON(3736): pam_unix(cron:session): session closed for user roheerumi
 3월 13 11:27:01 devops CRON(3766): pam_unix(cron:session): session opened for user roheerumi by (uid=0)
 3월 13 11:27:01 devops CRON(3767): (roheerumi) CMD (echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log)
 3월 13 11:27:01 devops CRON(3766): pam_unix(cron:session): session closed for user roheerumi
 3월 13 11:30:01 devops CRON(3811): pam_unix(cron:session): session opened for user root by (uid=0)
 3월 13 11:30:01 devops CRON(3811): pam_unix(cron:session): session closed for user root
 
 # 크론 재시작
roheerumi@devops:~$ systemctl restart cron
roheerumi@devops:~$ ps -ef | grep cron
root        4011       1  0 11:43 ?        00:00:00 /usr/sbin/cron -f
roheeru+    4014    1853  0 11:43 pts/1    00:00:00 grep --color=auto cron

# 크론 종료
roheerumi@devops:~$ systemctl stop cron
roheerumi@devops:~$ ps -ef | grep cron
roheeru+    4049    1853  0 11:45 pts/1    00:00:00 grep --color=auto cron