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인 디렉터리, 파일을 찾아주는데, 오류 로그는 보여주지 않고 정상 결과값만 보여준다.
-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 명령으로 나온 결과값 입력
```````````

## 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 서비스는 영구저장장치를 사용하고, 없으면 일시적 스토리지를 사용한다.