루트계정에서 진행

apt-get install mailutils

Configuration : Internet Site

System mail name 

 

mail 명령의 대표적인 옵션

-s : 메일 제목

-r : 발신자 주소

-c : 참조 목록

-b : 숨은 차모

-a : 첨부 파일

크론탭에 위와 같이 등록해주면 30분마다 메일이 발송된다.

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

로깅 실습  (0) 2024.02.22
jshell을 활용해서 어플리케이션 로깅 체험하기  (0) 2024.02.22
크론잡과 크론탭  (0) 2024.02.21
Shell Script 실습  (0) 2024.02.20
Shell Script  (0) 2024.01.17

1. 크론잡과 크론탭이란?

- 리눅스 시스템에서 crontab을 사용하여 작업을 예약할 수 있다.

- crontab : 시스템에 주기적으로 실행되는 작업을 설정하는 데 사용되는 유닉스 기반의 시간 기반 작업 스케줄러

- 일반적으로 스크립트, 명령 또는 프로그램을 지정된 시간에 실행하도록 예약하는 데 사용

 

루트 계정에서 다음 명령을 이용하여 환경설정을 진행한다.

# apt-get install cron
# apt-get install sudo

 

crontab -e 를 해주면 위와 같이 크론탭 파일이 열리고, 해당 파일을 수정하여 스케줄링화된 작업을 등록할 수 있다.

또한, crontab -l로 크론잡 목록을 조회할 수 있다. 아직 등록된 것이 없기 때문에 위와 같이 출력된다.

# sudo service cron start
# sudo systemctl start cron

위 명령어를 이용하여 최초에는 크론 데몬을 실행해줘야 한다.

 

 

2. 잡 등록해보기

* * * * * command_to_execute

- 분(0~59), 시간(0~23), 일(1~31), 월(1~12), 요일(0-7, 0과 7은 일요일을 나타냄) ex) 0 3 * * * 은 매일 새벽 3시를 의미

- 해당 별표 지점에 */주기를 적어도 된다. ex) */10 * * * * 코드 : 10분마다

>>는 append의 의미를 가지기에 매 분마다 date의 결과를 화면에 찍어줄 것이다.

※ 로깅 등을 할 때 명령어나 실행구문은 되도록 절대경로로 작성하는 것이 바람직하다.

이와 같이 cron.log 파일이 생성되고 매 분마다 date 결과를 찍어주는 것을 볼 수 있다.

$ sudo service cron start

크론잡은 기본적으로 아무 조치를 취하지 않아도 자동으로 실행되지만, 실행되지 않는다면 위와 같이 강제로 시작시킬 수도 있다.

 

💡 실습하기

더보기

매 분마다 특정 문장을 로그에 남겨주는 cronjob 등록하기

시간 정보와 특정 문장을 같이 남도록 등록하기

ex) Wed Feb 21 05:02:01 UTC 2024 : hello cronjob!!!

위와 같이 "$()"를 이용하여 한 줄에 출력하도록 하는 것이 가능하다.

위와 같이 cronjob을 등록할 수 있다.

조회해보면 crontest.log가 잘 생성된 것을 볼 수 있고, 앞서 등록한대로 매 분마다 로그가 잘 남겨지는 것을 확인할 수 있다.

 

 

3. 로깅 본격적으로 해 보기

먼저, 위와 같이 error_out.sh 파일을 생성하고 실행 시 에러가 발생할 구문을 작성해주었다.

chmod로 권한을 준 후 실행해보면 j라는 옵션은 없으므로 위와 같이 오류 메시지가 출력된다.

리다이렉션을 이용하여 err.log에 찍은 후 err.log 파일을 cat으로 확인해보면 아무 내용이 출력되지 않는다.

리다이렉션은 추가적인 옵션이 없다면 정상적인 상황에서 발생하는 메세지만 저장해주고, 오류에 의해 발생하는 메세지를 정상적인 상황에서 발생하는 메세지로 변환해주는 옵션을 추가해야 한다.

해당 내용이 2>&1이고, 이 옵션을 추가하여 err.log에 찍고 조회해보면 위와 같이 오류 메시지가 잘 출력되는 것을 볼 수 있다.

1 : 정상적인 상황에서 발생하는 메시지

2 : 오류에 의해 발생하는 메시지 

2>&1 : 2에 해당하는 메시지를 1 유형으로 변환해주는 옵션

이번에는 정상문장 ls -al과 오류유발문장 ls -j를 같이 적어보았다.

실행 권한을 준 후 실행해보면 위와 같이 정상 결과값과 오류 메시지가 출력된다.

2>&1을 포함하지 않고 로그파일을 만든 후 조회해보면 정상 결과만 출력되는것을 확인할 수 있다.

2>&1을 포함하면 오류메시지까지 모두 저장되어 출력되는 것을 확인할 수 있다.

 

💡 실습하기

더보기

1. 아래 양식에 맞춰 주기적으로 시간과 메시지를 남겨주는 로깅을 해 보자

    yyyy-MM-dd hh:mm:ss - 메시지

2. top을 활용하면 현재 pc 자원에 대한 정보가 나온다.

     yyyy-MM-dd hh:mm:ss - %Cpu(s)... 형식으로 매 10초마다 자원량을 기록하는 쉘 스크립트를 만들어 로깅해보자

 

 

4. 시스템에서 주로 사용하는 명령어와 로깅 항목

- uname : 시스템 및 커널정보 확인, -r(커널 릴리즈 정보), -p(프로세스 정보), -a(전부)

- grep : 조회 내용에서 특정 단어가 포함된 줄 조회, -i(대소문자 무시), -v(제외하고 확인), -E(정규표현식)

- sar : cpu, 메모리, 소켓 i/o 등의 정보 확인

 

1) CPU 사용량 로깅

#!/bin/bash

# 현재 CPU 사용량을 top 명령어로 가져와서 로그 파일에 기록
top -b -n1 | grep "Cpu(s)" >> cpu_usage.log

 

2) 메모리 사용량 로깅

#!/bin/bash

# 현재 메모리 사용량을 free 명령어로 가져와서 로그 파일에 기록
free -m | grep "Mem:" >> memory_usage.log

 

3. 디스크 공간 로깅

#!/bin/bash

# 현재 디스크 사용량을 df 명령어로 가져와서 로그 파일에 기록
df -h >> disk_space_usage.log

 

4. 네트워크 트래픽 로깅

#!/bin/bash

# 현재 네트워크 인터페이스의 트래픽을 가져와서 로그 파일에 기록
ifstat -n >> network_traffic.log

 

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

jshell을 활용해서 어플리케이션 로깅 체험하기  (0) 2024.02.22
크론탭 메일전송  (0) 2024.02.21
Shell Script 실습  (0) 2024.02.20
Shell Script  (0) 2024.01.17
Devops와 SE를 위한 리눅스 커널 이야기  (0) 2024.01.17

1. 원작자가 초기 세팅한 후 깃허브 업로드 및 협업자 콜라보레이터 등록

2. 브랜치 분할(master/develop)

git branch '브랜치명' 명령어를 이용하여 브랜치를 분할한다.

 

3. 브랜치 분할이 끝났으면 동료가 로컬에 클론을 뜸

 

4. 브랜치 분할 후 클론 뜬 레포지토리에서 master 브랜치만 보인다면 로컬에서 git branch -r을 하면 빨간색으로 보임

위와 같이 develop 브랜치가 있는 것을 확인할 수 있다.

checkout 명령어를 이용하여 develop 브랜치로 잡아준다.

이슈 탭에서 각자 할 작업을 작성해준다.

위와 같이 이슈 번호가 생성된 것을 확인할 수 있다.

develop 브랜치로 잡혀 있는 상태에서 feature/3라는 브랜치를 분할해준 후 해당 브랜치로 잡아준다.

수정(파일 추가) 후 add, commit, push를 진행해준다.

위와 같이 브랜치가 추가된 것을 볼 수 있고, 내가 작성한 feature/3로 가보면 수정사항이 잘 올라간 것을 확인할 수 있다.

풀 리퀘스트 탭에서 위와 같이 feature/3 브랜치를 develop 브랜치로 머지 요청을 진행한다. 

동료가 승인하면 Open 부분이 Merge로 변경된다.

issue 탭에서 완료 처리를 진행한다.

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

풀 리퀘스트  (0) 2024.02.20
Github CLI  (0) 2024.01.31
.gitignore 파일의 필요성  (0) 2024.01.12
  (0) 2024.01.12
클론  (0) 2024.01.11

타겟 저장소에서 Fork 버튼 클릭

위 과정을 통해 상대방 레포지토리와 내 레포지토리의 버전이 같은 상태가 된다.

위와 같이 현재 내 계정에 fork된 것을 확인할 수 있고, 해당 주소를 이용하여 clone을 진행한다.

파일 수정 후 add, commit, push를 진행한다.

이제 개선된 내 코드의 버전이 앞서므로 내 코드를 pull로 받아가라고 요청해야 한다.

이는 Pull requests로 요청할 수 있다. 

위와 같이 New pull request와 Create pull request를 진행해주면 풀 리퀘스트가 요청된다.

이 후 원작자의 알림창에 풀리퀘스트 요청이 들어오고, 마음에 든다면 Merge pull request 버튼을 클릭하여 받거나 거절할 수 있다.

 

※ 이 방식은 실수로 커밋될 일이 없다는 장점이 있지만, 풀 리퀘스트가 올 때마다 원작자가 매번 확인해야 한다는 단점이 있다.

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

git-flow  (0) 2024.02.20
Github CLI  (0) 2024.01.31
.gitignore 파일의 필요성  (0) 2024.01.12
  (0) 2024.01.12
클론  (0) 2024.01.11

1. 환경설정

$ docker run -d --name=shellprac ubuntu:22.04
$ docker exec -it shellprac bash

위 명령어를 통해 도커 컨테이너 환경에서 실습을 진행했다.

# apt-get update
# apt-get install file

먼저, 쉘스크립트 내에 작성된 명령어를 확인하기 위해서 file을 설치해준 후 진행한다.

위 명령어로 /usr/bin/* 경로인 모든 파일 중 shell script를 검색하면 위와 같이 쉘스크립트로 작성된 명령어들을 확인할 수 있다.

루트계정으로 명령을 내리지 않기 위해 jihyun 계정을 추가하여 실습을 진행했다.

위와 같이 sandbox 폴더를 생성한 후 실습을 진행했다.

 

※ 쉘 스크립트를 사용하면 좋은 경우

① 중규모 시스템에서 자동화하기

② 성능보다 자동화 자체에 방점을 두기

 

 

2. 일기장 작성 실습

root # apt-get install nano -y
jihyun $ nano diary.sh

루트 계정에서 nano 에디터를 설치한 후 다시 돌아와 diary.sh에 아래와 같은 스크립트를 작성했다.

먼저, ${HOME}/diary라는 경로를 directory 변수에 저장한다. (※ 할당 연산자 사용 시 띄어쓰기 금지)

directory 변수에 적힌 경로에 폴더가 존재하지 않는다면 mkdir 명령으로 폴더를 생성해준다.

nano 에디터를 이용하여 연-월-일.txt 형식으로 당일 서버시간 기준 날짜로 일기 파일을 생성해준다.

위와 같이 실행 권한을 부여한 후 조회해보면 diary.sh가 잘 생성된 것을 확인할 수 있다.

diary.sh를 실행해주면 자동으로 home 폴더 하위에 diary 폴더를 만들고, 만약 없다면 연-월-일.txt라는 파일을 nano 에디터로 실행해준다.

또한, 파일에 위와 같은 문구를 작성해주고 다시 diary.sh를 실행해보면 이미 diary 폴더가 존재하므로 새로 만들지는 않고, 아까 작성 완료한 내용이 기입된 채로 파일이 열리는 것을 확인할 수 있다.

 

일기장 쉘스크립트를 개선하기 위해 diary.sh 코드를 아래와 같이 수정했다.

먼저, directory 폴더 하위에 diaryfile이라는 명칭으로 연-월-일.txt를 저장하는 변수명을 하나 더 만들어주었따.

diaryfile이 존재하지 않는다면 > 기호를 이용하여 해당 파일을 만들되 연월일을 집어넣은 채로 파일을 생성한 후 열어준다.

기존의 일기장 파일을 삭제한 후 다시 실행해보면 위와 같이 날짜가 적힌 채로 열리는 것을 확인할 수 있다.

 

 

3. 재귀호출을 이용한 폴더 내부 조회하기

 

먼저, nano를 이용하여 tree.sh 파일을 생성하고 아래와 같은 코드를 작성한다.

list_recursive() 함수는 파라미터를 하나 받아서 filepath라는 지역변수에 저장을 하고, 해당 filepath 변수에 든 값을 echo로 화면에 출력한다.

if문을 이용해 해당 파일경로가 존재한다면 file 경로에 존재한다는 메세지를 echo로 날리고 종료한다.

파라미터로 받은 파일이나 경로가 존재하지 않는 경우는 아무 일도 하지 않고, 존재한다면 존재한다는 확인 후에 종료된다.

위와 같이 실행 권한을 준 후 실행해보면 홈 디렉토리 경로는 존재하므로 존재한다는 문구가 출력되고, sandbo라는 경로는 존재하지 않으므로 아무 일도 하지 않는 것을 확인할 수 있다.

 

 

4. 재귀호출 자기자신 호출하기

단순히 해당 경로가 존재하는 것 뿐만 아니라 폴더와 같이 트리형으로 작성된 계층을 순회하도록 하기 위해 아래와 같이 코드를 수정했다.

특정 경로를 받아서 존재한다면 ls를 이용하여 해당 폴더경로 내부의 파일을 fname이라는 반복문 변수에 대입하여 해당 폴더 내부의 fname을 하나하나 출력해준다.

이렇게 하여 특정 경로 하위에 있는 파일들을 모두 출력할 수 있다.

저장 후 실행해보면 위와 같이 홈 디렉토리에 존재하는 파일명들을 출력해주는 것을 확인할 수 있다.

하위 경로를 모두 훑고 다니면서 최종적인 결과를 얻어내기 위해 위와 같이 코드를 수정했다.

특정한 파일경로 존재 시 해당 파일경로를 토대로 다시 list_recursive를 호출한다.

재귀호출을 통해 fname의 하위경로를 호출하지만, -d 옵션이 첫 if문에 걸려 있으므로 폴더가 아니면 따로 추가 재귀가 돌지 않는다.

즉, 폴더인 경우만 재귀호출, 아닌 경우는 파일만 조회해주고 탈출하는 구문이다.

위와 같이 현재 경로 하위에 있는 모든 폴더 및 파일을 다 순회하며 조회하는 것을 확인할 수 있다.

 

 

5. 순회 시 들여쓰기로 계층 표시

들여쓰기를 통해 더욱 가독성 높은 조회를 하기 위해 코드를 아래와 같이 수정했다.

위와 같이 들여쓰기 변수 indent를 생성한다.

처음에는 ""와 같은 빈 문자열을 받지만 내부적으로는 들여쓰기가 들어가도록 파라미터를 전달시킬 수 있다.

filepath##*/은 전방 최장 매치로 패턴에 일치하는 부분을 제거한다. 즉, */에 해당하는 상위 폴더를 나타내는 / 문자를 제거하는 역할을 한다.

실행해보면 위와 같이 들여쓰기가 들어간 채로 잘 출력되는 것을 확인할 수 있다.

 

 

6. 이름에 띄어쓰기가 들어간 파일 추가 처리

현재 작성 구문은 띄어쓰기가 되면 하나의 파일명으로 인식하지 않고, 위와 같이 띄어쓰기 갯수만큼 쪼개진 파일명으로 인식한다.

이는 ls 명령이 띄어쓰기를 파일 구분자로 삼고 있기 때문이다.

내부 필드를 구분할 수 있도록 IFS라는 환경 변수를 조작하여 공백을 내부 문자 구분 기준에서 없애버리는 방식으로 해결할 수 이싿.

위와 같이 IFS에 줄바꿈을 등록하면 더 이상 띄어쓰기를 구분자로 삼지 않는다.

다만, IFS를 바꿔둔 채로 두면 다음 로직에 영향을 줄 수 있기 때문에 모든 호출이 끝나면 IFS 값을 원래 값으로 돌려놓는 조치가 필요하다. 

위와 같이 공백도 구분자가 아닌 하나의 파일로 인식되는 것을 확인할 수 있다.

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

크론탭 메일전송  (0) 2024.02.21
크론잡과 크론탭  (0) 2024.02.21
Shell Script  (0) 2024.01.17
Devops와 SE를 위한 리눅스 커널 이야기  (0) 2024.01.17
프로세스  (0) 2024.01.16

+ Recent posts