Linux

RHCSA 공부 1일차

황동리 2024. 4. 4. 21:22
반응형

1. 명령줄 생산성 향상

Bash 스크립트 작성

  • 스크립트의 첫 번째 행은 '#!' 표기법으로 시작한다.
  • '#!' 두 문자의 이름은 she-bang 또는 hash-bang을 따서, sharp, hash, bang이라고 합니다.
  • bash 구문 스크립트 파일의 경우 첫 번째 줄은 "#!/usr/bin/bash" 로 작성한다.
  • 쉘 스크립트 파일을 일반 명령으로 실행하려면 실행 권한이 있어야 한다.
  • Bash 쉘 스크립트가 쉘의 PATH 환경변수에 나열된 디렉터리에 저장된 경우 컴파일된 명령을 실행하는 것과 유사하게 파일 이름만 사용하여 쉘 스크립트를 실행 할 수 있다.
    => echo $PATH 명령으로 PATH 경로 확인

인용 특수 문자

  • Bash 쉘에서 특별한 의미를 갖는 문자와 단어가 있다. 이러한 문자들을 특별한 의미가 아닌 리터럴 값으로 사용해야 하려면 스크립트에서 해당 문자를 이스케이프 한다.
  • 백슬래시 문자(), 작은 따옴표(''), 큰따옴표("")를 사용하여 이러한 문자의 특수한 의미를 제거 합니다.

변수

리다이렉션

  • test.sh > /tmp/today.txt
    => 리다이렉션 하나를 넣어주면 테스트 쉘 스크립트의 결과가 /tmp/today.txt에 저장된다.
  • echo "1" >> /tmp/today.txt
    => 리다이렉션을 두개 넣어주면 원래 내용의 맨 아래에 추가적으로 내용이 들어간다.

(연습) 간단한 Bash 스크립트 작성

firstscript.sh
#!/usr/bin/bash
echo "This is my first bash script" > ~/output.txt
echo "" >> ~/output.txt
echo "######################################################" >> ~/output.txt
echo "LIST BLOCK DEVICES" >> ~/output.txt
echo "" >> ~/output.txt
lsblk >> ~/output.txt
echo "" >> ~/output.txt
echo "######################################################" >> ~/output.txt
echo "FILESYSTEM FREE SPACE STATUS" >> ~/output.txt
echo "" >> ~/output.txt
df -h >> ~/output.txt
echo "#####################################################" >> ~/output.txt

결과
sh firstscript.sh
cat output.txt


스크립트의 반복문 및 조건문

for 문의 기본 형식

for [VARIABLE] in [LIST]
do
	[COMMAN VARIABLE]
done
ex) for 문
for i in {1..3}
do
	echo $i
done
=> 
1
2
3

if 문의 기본 형식

if [CONDITION]
then
	[STATEMENT]
fi

- 옵션
[ -z ] : 문자열의 길이가 0이면 참
[ -n ] : 문자열의 길이가 0이 아니면 참

[ -eq ] : 값이 같으면 참
[ -ne ] : 값이 다르면 참
[ -gt ] :  값1 > 값2
[ -ge ] : 값1  >= 값2
[ -lt ] : 값1 < 값2
[ -le ] : 값1 <= 값2

[ -a ] : &&연산과 동일 and 연산
[ -o ] : ||연산과 동일 xor 연산
[ -d ] : 파일이 디렉토리면 참
[ -e ] : 파일이 있으면 참
[ -L ] : 파일이 심볼릭 링크면 참
[ -r ] : 파일이 읽기 가능하면 참
[ -s ] : 파일의 크기가 0 보다 크면 참
[ -w ] : 파일이 쓰기 가능하면 참
[ -x ] : 파일이 실행 가능하면 참
ex) if 문
systemctl status httpd >> /dev/null
status_result=$?

if [ $status_result -eq 0 ]
then
        echo "httpd daemon started"
else
        echo "httpd daemon stopped"
        sudo systemctl start httpd
        systemctl status httpd >> /dev/null
        status_result=$?
                if [ $status_result -eq 0 ]
                then
                        echo "httpd daemon start"
                else
                        echo "httpd daemon stop"
                fi
fi
}

리눅스 표현식

기본 및 확장 정규 표현식

기본 정규 표현식과 확장 정규 표현식의 한 가지 다른 점은 |, +, ? (,), {,} 특수 문자의 동작입니다. 기본 정규 표현식 구문에서는 백슬래시 \ 문자를 접두사로 사용하지 않는 경우에만 이러한 문자에 특별한 의미가 있습니다.

약간의 차이가 ^, $, * 문자를 처리하는 방법에 적용됩니다.

기본 및 확장 정규 표현식 구문

^: 행의 시작부분을 지칭
ex) ^cat => cat으로 시작하는 행을 의미

$: 행 끝 부분을 지칭
ex) cat$ => cat으로 끝나는 행을 의미

\b: 단어 가장자리에 있는 빈 문자열과 일치
\B: 단어의 가장자리가 아닌 위치에 있는 빈 문자열과 일치
\<: 단어의 시작 부분에 있는 빈 문자열과 일치
\>: 단어의 끝 부분에 있는 빈 문자열과 일치
; : 세미콜론은 문자로 시작하는 모든 행을 찾아 제외
	ex) grep -v '^[#;]' /etc/systemd/system/multi-user.target.wants/rsyslog.service
    => # 으로 주석처리된 행들을 제외하고 보여준다.
ex) find / -user a 2> /dev/null
	=> 소유자가 a인 디렉터리, 파일을 찾아주는데, 오류 로그는 보여주지 않고 정상 결과값만 보여준다.

grep 명령 사용

grep 명령은 일치 항목을 구문 분석할 정규 표현식과 파일을 지정합니다.

grep 알아보기
word.txt

Cat
cat
dog
concatenate
dogma
category
educated
boondoggle
vindication
childog
1

grep 명령 옵션

-i: 대소문자를 구분하지 않습니다.
	ex) cat word.txt |grep -i CaT
-v: 일치하는 항목이 없는 행만 표시
	ex) cat word.txt |grep -v cat
-r: 일치하는 항목을 파일, 디렉터리에서 반복적으로 검색
-A(after) NUMBER: 일치하는 항목 다음의 행 수를 표시
	ex) cat word.txt |grep Cat -A 3
-B(befor) NUMBER: 일치하는 항목 앞의 행 수를 표시
	ex) cat word.txt | grep childog -B 3
-e: 한번에 여러 개의 일치하는 항목을 찾을 수 잇음
	ex) cat word.txt |grep -e cat -e dog
-E: e와 비슷함
	ex) cat word.txt |grep -E "cat|dog"

2. 향후 작업 예약

지연된 사용자 작업 예약 (at)

특정 시간에 하나 이상의 명령을 실행해야하는 경우, at 명령어를 사용한다.

at 사용법

at: at <옵션> [시간] < [명령어] 와 같은 형식으로 사용한다.
	ex) echo "date >> /home/student/myjob.txt" | at now +2min
    	=> 현재 시간으로부터 2분 뒤에 date 명령어로 나온 결과를 /home/student/myjob.txt에 저장한다.

atq: 현재 사용자에 대해 at으로 걸어놓은 작업을 보는 명령어
ex) [user@host ~]$ atq
28 Mon May 16 05:13:00 2022 a user
29 Tue May 17 16:00:00 2022 h user
30 Wed May 18 12:00:00 2022 a user
- 28, 29,30 등의 숫자는 고유한 작업 번호
- 그 뒤로는 예약된 작업 실행 날짜와 시간
- a는 작업이 기본 대기열 a에 예약됨
- user는 작업의 소유자
atrm: at으로 걸어놓은 작업 삭제
ex) atrm [작업 번호]

## 반복 실행 사용자 작업 예약 (crontab)

정해진 시간에 반복하는 작업은 주로 crontab으로 실행한다.

> crontab
````````
crontab -l: 현재 사용자의 작업을 나열한다
crontab -r: 현재 사용자의 모든 작업을 제거한다.
crontab -e: 현재 사용자의 작업을 편집한다.
crontab filename: 모든 작업을 제거하고 filename에서 읽은 작업으로 바꾼다. 이 명령은 파일이 지정되지 않은 경우 stdin 입력을 사용한다.

/etc/crontab 파일을 열어보면 사용 방법이 나와있는데,

*   *   *  *  *   명령
분 시간 일 월 요일  명령 => 이렇게 작성을 하면 된다.

ex) crontab -e
	*/2 * * * * date >> /home/student/my_first_cron_job.txt
    => 매 2분마다 /home/student/my_first_cron_job.txt 파일에 date 명령으로 나온 결과값 입력
```````````
![](https://velog.velcdn.com/images/dongli/post/41ced7fc-1d84-43a6-adb4-e0ecf0b6c998/image.png)

## systemd 타이머

편리한 디버깅을 위해 systemd 타이머 유닛은 시스템 저널에 타이머 이벤트를 기록한다.

sysstat 패키지는 10분마다 시스템 통계를 수집하는 sysstat-collect.timer 서비스라는 systemd 타이머 유닛을 제공한다. 

> /usr/lib/systemd/system/sysstatcollect.timer
````
...output omitted...
[Unit]
Description=Run system activity accounting tool every 10 minutes 
[Timer]
OnCalendar=*:00/10
[Install]
WantedBy=sysstat.service

unit과 timer의 시간을 변경하여 더 복잡한 시간 간격을 지정할 수도 있다.

systemd 타이머 = 시스템 활동 데이터를 수집함 (잘 안씀)
시스템의 모든 성능 정보 등을 볼수 있어서 시스템이 에러가 났을 때 트러블슈팅 할때 유용하게 사용된다.

임시 파일 관리

대부분의 중요한 애플리케이션과 서비스는 임시 파일과 디렉터리를 사용합니다. 일부 애플리케이션 및 사용자는 /tmp 디렉터리를 사용하여 임시 작업 데이터를 보관하지만 기타 애플리케이션은 /run 아래에 있는 데몬 및 사용자 지정 휘발성 디렉터리와 같이 메모리에만 있는 작업별 위치를 사용합니다. 시스템이 재부팅되거나 전원이 꺼지면 메모리 기반 파일 시스템이 자동으로 정리됩니다.

일반적으로 데몬과 스크립트는 예상되는 임시 파일과 디렉터리가 있는 경우에만 정확하게 작동합니다. 또한 디스크 공간 문제나 부실 작업 데이터가 발생하지 않도록 영구저장장치에 있는 임시 파일을 제거해야 합니다.

Red Hat Enterprise Linux에는 systemd-tmpfiles 툴이 포함되어 있습니다. 이 툴은 임시 디렉터리와 파일을 관리하는 체계적이고 구성 가능한 방법을 제공한다.

systemd 타이머를 사용하여 임시 파일 정리

  • 위 구성에서 OnBootSec=15min 매개 변수는 systemd-tmpfiles-clean.service 유닛이 시스템이 부팅되고 15분 후에 시작된다는 뜻
  • OnUnitActiveSec=1d는 systemd-tmpfiles-clean.service 유닛에 대한 추가 트리거가 서비스 유닛이 마지막으로 활성화되고 하루 뒤에 발생함을 뜻함
  • 설정 파일을 변경한 후에는 systemd 데몬을 reload 해주어야한다. (systemctl daemon-reload)

수동으로 임시 파일 정리
systemd-tmpfiles --clean 명령은 구성 파일에 정의된 최대 사용 기간보다 최근에 엑세스, 변경 또는 수정되지 않은 모든 파일들을 삭제한다.

systemd-tmpfiles-clean 서비스 구성 파일은 세 위치에 존재한다.
1. /etc/tmpfiles.d/ 디렉터리의 파일은 사용자 지정 임시 위치를 구성하고 벤더가 제공한 기본값을 재정의하는 데 사용한다.
2. /run/tmpfiles.d/ 디렉터리의 파일은 일반적으로 데몬이 자체 런타임 임시 파일을 관리하는 데 사용하는 휘발성 파일이다.


3. 로그 분석 및 저장

시스템 로그 아키텍처

시스템 로깅

운영 체제 커널 및 기타 프로세스는 시스템이 실행 중일 때 발생하는 이벤트의 로그를 기록한다. 이러한 로그들은 시스템 감사 및 문제 해결에 사용된다.

RHEL은 systemd-journald 및 rsyslog 서비스를 사용하여 syslog 메시지를 처리한다.

systemd-journald 서비스는 여러 소스에서 이벤트 메세지를 수집한다.

  • 시스템 커널
  • 부팅 프로세스 초기 단계 출력
  • 데몬의 표준 출력 및 표준 오류
  • syslog 이벤트

시스템 로그 파일
/var/log/messages: 대부분 syslog 메시지가 여기에 기록된다. 단, 인증 및 이메일 처리와 예약된 작업 실행에 대한 메시지, 순수하게 디버깅에만 관련된 메시지는 예외
/var/log/secure: 보안 및 인증 이벤트에 대한 syslog 메시지
/var/log/maillog: 메일 서버에 대한 syslog 메시지
/var/log/cron: 예약된 작업 실행에 대한 syslog 메시지
/var/log/boot.log: 시스템 시작에 대한 비 syslog 콘솔 메시지

syslog 파일 검토

많은 프로그램이 syslog 프로토콜을 사용하여 이벤트를 시스템 로그에 기록한다. 각 로그 메시지는 기능 및 우선순위에 따라 분류된다.

  • 로그 레벨
    |Code|우선 순위|우선 순위 설명|
    |---|---|---|
    |0|emerg|시스템을 사용할 수 없음|
    |1|alert|즉각적인 조치 필요|
    |2|crit|심각한 상태|
    |3|err|심각하지 않은 오류 상태|
    |4|경고|경고 상태|
    |5|notice|정상이지만 중요한 이벤트|
    |6|info|정보 이벤트|
    |7|debug|디버깅 수준의 메시지|

rsyslog 서비스는 로그 메시지의 기능 및 우선 순위를 사용하여 메시지를 어떻게 처리할지 결정한다. 규칙은 /etc/rsyslog.conf 파일과 /etc/rsyslog.d 디렉터리의 파일에서 기능과 우선순위를 구성한다.

syslog 항목 분석
Mar 20 20:11:48 localhost sshd[1433]: Failed password for student from 172.25.0.10 port 59344 ssh2

  • Mar 20 20:11:48 : 로그 항목의 타임스탬프를 기록한다
  • localhost : 로그 메시지를 전송하는 호스트이다.
  • sshd[1433] : 로그 메시지를 전송한 프로그램 또는 프로세스 이름 및 PID 번호이다.
  • Failed password for "": 전송된 메시지이다.

시스템 저널 항목 검토

저널에서 로그 메시지를 검색하려면 journalctl 명령을 입력하면 된다.

journalctl

  • journalctl 명령은 중요한 로그 메시지를 강조 표시한다.
  • journalctl -n 10 을 입력하면 마지막 10개의 로그 항목을 보여준다.
  • journalctl -p 옵션을 사용하면 로그 레벨에 따라 볼수 있다.
    ex) journalctl -p err
  • journalctl -u 옵션은 지정된 유닛 이름의 로그를 볼 수 있다.
    ex) journalctl -u sshd.service

시스템 저널 보존

시스템 저널 스토리지

기본적으로 /run/log 디렉터리에 시스템 저널을 저장하며 재부팅 후 시스템에서 시스템 저널을 지운다. 재부팅 후에도 저널이 유지되도록 /etc/systemd/journald.conf 파일에서 구성 설정을 변경 할 수 있다.


storage 매개 변수를 수정하여 설정을 변경 할 수 있다.

  • persistent: 재부팅 후에도 계속 /var/log/journal 디렉터리에 저널을 저장한다.
  • volatile: 일시적인 /run/log/journal 디렉터리에 저널을 저장한다.
  • auto: /var/log/journal 디렉터리가 있으면 systemd-journald 서비스는 영구저장장치를 사용하고, 없으면 일시적 스토리지를 사용한다.
  • none: 스토리지를 사용하지 않는다.
반응형

'Linux' 카테고리의 다른 글

NFS mount 오류 확인 및 해결 (Connection time out)  (0) 2024.04.16
RHCSA 공부 2일차  (0) 2024.04.13
Quota란?  (1) 2024.01.23
[Ubuntu 20.04] DNS Master - Slave 이중화 구성  (0) 2024.01.19
Local Repository 만들기  (0) 2024.01.12