1. 사용 명령어 |
(1) cat
(2) rpm
2. 키워드 & 사용처 |
(1) 키워드
RPM 패키지, 갱신 시각, 설치, 업데이트
(2) 사용처
여러 서버에 패키지 설치 및 업데이트를 진행하는데 서버마다 작업에 실수가 없는지 확인하고 싶을 때 사용합니다.
3. 실행 예제 |
$ cat pkg.lst
httpd
zsh
xz
git
$ ./rpm-lastdate.sh pkg.lst
2021/04/19 11:14:11 : httpd
2021/04/20 13:43:23 : zsh
2020/06/03 15:21:09 : xz
2021/03/24 09:33:12 : git
4. 스크립트 |
#!/bin/sh
# 지정한 목록 파일 존재 확인
if [ ! -f "$1" ]; then ①
echo "대상 패키지 목록 파일이 존재하지 않습니다: $1" >&2 ①
exit 1
fi
# 인수로 지정한 파일($1)에서 패키지 목록 얻기
pkglist=$(cat "$1") ②
# 설치된 rpm 갱신일자 출력
rpm -q $pkglist --queryformat '%{INSTALLTIME:date} : %{NAME}\n' ③
5. 해설 |
이 스크립트는 명령행 인수로 지정한 텍스트 파일에서 RPM 패키지명을 읽어서 그 RPM 패키지가 설치 또는 갱신된 날짜를 목록으로 표시합니다.
리눅스 서버를 구축 및 운용하다 보면 수십 대의 서버에 같은 패키지를 설치하거나 보안 패치를 위해 피키지를 갱신하는 서버 점검을 빈번히 하게 됩니다. 이때 '10대 서버 중 한대만 갱신하지 않았다', '나중에 설치하려다가 한 대만 설치하는 걸 잊었다' 같은 작업 실수가 자주있습니다. 이 예제처럼 확인 스크립트를 준비해두면 점검 종료 확인 시 도움이 될 것입니다.
이 스크립트는 우선 ①에서 위치 파라미터 $1으로 지정한 목록 파일이 존재하는지 확인합니다. -f는 대상이 일반 파일인지 확인하는 연산자입니다. 여기에 부정 연산자 !로 일반 파일이 아니면 에러를 표시하고 종료합니다.
②에서 명령행 인수로 ㅗ지정한 파일 $1으로 셸 변수 pkglist에 패키지명을 읽어들입니다. 이 실행 예제에서 pkg.lst 파일 내용은 다음과 같습니다.
httpd
zsh
xy
git
즉 여기서는 httpd, zsh, xy, git 패키지를 설치 또는 갱신한 날짜를 확인한다고 가정합니다. 실제 사용할 때는 상황에 맞게 수정하면 됩니다.
②는 cat 명령어로 pkg.lst 파일 내용을 출력해서 명령어 치환 $( )을 이용해서 출력 결과를 셸 변수 pkglist에 대입합니다. cat 명령어 결과를 사용하므로 셸 변수 pkglist에는 여러 줄로된 목록이 그대로 대입됩니다.
③에서 지정한 RPM 패키지를 설치 및 갱신한 날짜를 rpm 명령어로 표시합니다. 여기서 rpm 명령어에 지정하는 것은 -q 옵션과 표시 포맷을 지정하는 --queryformat 옵션입니다.
rpm 명령어 -q 옵션은 대상 패키지를 지정합니다. 이때 여러 패키지를 지정할 수 있습니다. 여기서는 셸 변수 pkglist에 ②에서 조합한 패키지 목록이 들어 있으므로 이걸 그대로 지정합니다. 셸에서 줄바꿈을 표준 구분자로 해석하므로 ③처럼 $pkglist에 따옴표를 쓰지 않고 작성하면 줄바꿈을 구부낮로 셸 변수 확장을 해서 결과적으로 다음과 같은 명령어가 실행됩니다.
rpm -q httpd zsh xz git --queryformat '%{INSTALLTIME:date} : %{NAME}\n'
이때 ③을 잘못해서 큰따옴표로 "$pkglist"라고 하면 명령어 중간에 줄바꿈이 들어가서 에러가 발생하므로 주의해야 합니다.
--queryformat 옵션은 rpm 명령어를 표시하는 항목을 지정하는 옵션입니다. 서식 지정에서 사용하는 INSTALLTIME과 NAME은 각각 설치/갱신 시간, 패키지명을 나타냅니다. 또한 기본적으로 INSTALLTIME은 유닉스 시간(1970년 1월 1일부터 경과한 초)으로 표시되므로 :DATE라고 지정해서 년월일시로 표시하도록 합니다.
이렇게 해서 점검 대상 서버에서 예제 스크립트를 실행하면 각 패키지 설치/갱신 일시를 표시할 수 있습니다. 어떤 서버만 패키지 갱신 일시가 오래되었으면 패치 업데이트 작업을 안 했다는 걸 알 수 있을 것입니다. 그리고 패키지를 찾지 못했다고 표시되면 설치 작업을 하지 않았다는 것도 알 수 있습니다.
$ ./rpm-lastdate.sh pkg.lst
2021/04/19 11:14:11 : httpd
package zsh is not installed
2020/06/03 15:21:09 : xz
2021/03/24 09:33:12 : git
이렇듯 서버 구축 및 운용 시 작업 실수를 줄일 수 있게 됩니다.
<주의사항>
이 스크립트는 리눅스(CentOS)의 rpm 명령어를 사용하므로 CentOS나 레드햇에서만 동작합니다.
이 스크립트는 확인할 패키지 목록을 지정하는 파일이 비었을 때 rpm 명령어가 실패해 에러를 발생합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 서버 관리 - 111 특정 프로세스가 정지했는지 감시하기 (0) | 2021.04.29 |
---|---|
[Linux 셸 스크립트] 서버 관리 - 110 서버 구축 패키지 목록을 셸 스크립트 형태로 관리하기 (0) | 2021.04.27 |
[Linux 셸 스크립트] 서버 관리 - 108 파일명으로 설치된 RPM 패키지명을 확인하기 (0) | 2021.04.23 |
[Linux 셸 스크립트] 서버 관리 - 107 시스템 셧다운하기 (0) | 2021.04.23 |
[Linux 셸 스크립트] 서버 관리 - 106 허가된 사용자만 스크립트 실행 가능하게 하기 (0) | 2021.04.22 |
댓글