Solaris: PKG - 일부 패키지를 제외한 모든 패키지를 확인하는 스크립트

Solaris: PKG - 일부 패키지를 제외한 모든 패키지를 확인하는 스크립트

알려진 이유로 인해 실패할 것으로 예상되는 사전 정의된 패키지 목록을 제외한 모든 패키지의 유효성을 검사하려고 합니다. 이 스크립트는 시스템 기준을 확인하기 위해 우리 환경의 모든 Solaris 시스템에서 실행됩니다.

나는 이를 위해 작동하는 모든 기술에 개방적이며 한 줄에 넣을 수 있습니다(검증을 위해 사용하는 도구의 제한 사항).

나의 초기 아이디어는 pkg 목록을 얻고, 이를 AWK를 통해 실행하여 패키지 이름을 얻은 다음, 필요하지 않은 패키지를 필터링한 다음 나머지 패키지마다 개별적으로 별도의 pkg 확인을 실행하는 것이었습니다.

아래에 제가 만든 코드는 다음과 같습니다.

pkg list | awk 'BEGIN {c=0} $1 == "exclude1" || $1 == "exclude2" { next } { system("pkg verify " $1); c++ } END { if (c == 0) print "none" }'

내가 겪고 있는 문제는 pkg 유효성 검사에 실패하는 것이 있다는 것을 알고 있음에도 불구하고 출력이 표시되지 않는다는 것입니다.

나는 system(이 출력을 캡처할 것이라고 생각했지만, 나는 AWK를 비교적 처음 접했고 뭔가 잘못 이해하고 있는 것일 수도 있습니다.

답변1

nawkSolaris 11.3에서는 기본 설치 대신 awk. nawk("new ")를 사용하려고 하며 awk이는 경로( /usr/bin/nawk)에 있어야 합니다.

system()awk(모든 구현)의 함수는 명령의 출력을 반환 하지 않고 종료 코드를 반환합니다. 하지만 괜찮습니다. 아마도 실제 출력을 원하지 않을 것이기 때문입니다 pkg. 문제가 발생하면 pkg명령은 0이 아닌 종료 코드로 종료됩니다(설명서 참조 pkg).

다음 파이프라인은 pkg list출력을 가져와 첫 번째 줄(헤더)과 제외된 패키지 이름과 일치하는 모든 줄을 건너뜁니다. 나머지 입력 라인은 pkg verify패키지 이름을 사용하여 실행됩니다.system()

pkg verify0이 아닌 종료 상태가 반환되면 카운터가 증가합니다 . 처리가 끝나면 발생한 유효성 검사 오류 수를 보여주는 카운터가 표시됩니다.

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { if (system("pkg verify " $1)) { e++ } } END { printf("%d errors\n", e) }'

하지만 이는 상당히 비효율적이다. 패키지 목록을 가져와 한 번에 모두 확인하는 것이 더 빠릅니다.

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { print $1 }' | ( xargs pkg verify ) || echo "there were errors"

파일에 무시할 패키지 목록이 있는 경우:

pkg list | /usr/xpg4/bin/grep -F -v -f excluded.txt | nawk 'NR > 1 { print }' | ( xargs pkg verify ) || echo "there were errors"

답변2

awk 대신 gawk를 사용하도록 스크립트를 변경하세요.

간단한 테스트:

# pkg list|awk '{system("pkg verify $1")}'
# 

# pkg list|gawk '{system("pkg verify $1")}'
PACKAGE                                                                 STATUS
pkg://solaris/driver/storage/ssd                                         ERROR

관련 정보