rpm/grep을 사용하여 여러 서비스가 단일 라이너로 설치되어 있는지 확인하십시오.

rpm/grep을 사용하여 여러 서비스가 단일 라이너로 설치되어 있는지 확인하십시오.

다음 코드는 서비스(비어 있거나 지정된 서비스 최대 X개까지 변수에서 읽을 수 있음)가 설치되어 있는지 확인하고 적절한 조치를 취합니다.

... if ! rpm -qa | grep -qw $SERVICE; then ...

동일한 목표를 달성하면서 다음 형식으로 변수를 설정하고 읽을 수 있도록 하려면 어떻게 해야 합니까?

옵션 - 단일 공백으로 구분된 줄의 변수: 예:SERVICE=httpd mariadb mariadb-server

기본적으로 서비스가 설치되었는지 확인하는 단일 라인을 원합니다(0 - 99 범위일 수 있음).

완전한 생각:

SERVICE=mariadb httpd

if [ "`systemctl is-active $SERVICE`" != "active" ]; then
  if ! rpm -qa | grep -qw $SERVICE; then 
    yum -y install $SERVICE;
    echo "$SERVICE has been installed.";
  else systemctl start $SERVICE && echo "$SERVICE started"; \
  fi
fi

답변1

이 시도:

for f in $SERVICE; do if ! rpm -qa \| grep -qw $f; then ... fi; done

답변2

CentOS 6을 참조하세요.제공하다다음 파일 이름 중 하나와 일치합니다./etc/rc.d/init.d

귀하의 목적을 위해 가끔 RPM에서 제공되지 않는 사용자 정의 서비스 스크립트를 무시하고 다음을 수행하십시오.

for f in $SERVICE; do s=/etc/rc.d/init.d/$f; [ -f "$s" ] && rpm -qf "$s"; done

그러면 서비스 파일이 있는지 확인하고 해당 패키지 이름이 인쇄됩니다. 서비스 파일이 없으면 아무 것도 인쇄되지 않습니다.

구문을 테스트하는 동안 SERVICE명령줄 인수에서 구문을 설정하는 스크립트를 만들었습니다. 예를 들면 다음과 같습니다.

SERVICE="$*"

표시된 입력/출력 예:

$ /tmp/foo avahi-daemon blk-availability bluetooth certmonger cgconfig cgred cpusp
eed crond
avahi-0.6.25-15.el6.x86_64
lvm2-2.02.118-3.el6_7.4.x86_64
bluez-4.66-1.el6.x86_64
certmonger-0.77.5-1.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
cpuspeed-1.5-22.el6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64

이렇게하려면 귀하의 예에서

if ! rpm -qa | grep -qw $SERVICE; then 

당신은 그것을

if [ -z "$( rpm -qf /etc/rc.d/init.d/$SERVICE 2>/dev/null )" ] ; then

서비스 파일이 없으면 rpm표준 오류에 오류 메시지가 기록됩니다. 존재하지만 RPM에서 나온 것이 아닌 경우 rpm메시지가 표준 출력으로 반환됩니다. 이는 일관성이 있습니다. 사용자 정의 스크립트를 대체하기 위해 무언가를 설치해서는 안 됩니다.

CentOS 7의 경우 systemd동일한 아이디어를 사용할 수 있지만 디렉터리 레이아웃이 다릅니다. ".service" 파일을 다음 위치에 저장합니다.

/usr/lib/systemd/system/

다음과 같이 테스트할 수 있습니다.

if [ -z "$( rpm -qf /usr/lib/systemd/system/${SERVICE}.service 2>/dev/null )" ] ; then

내 CentOS 7 컴퓨터에서

  • 384개가 있다유닛 파일동력 경운기systemctl list-unit-files
  • 101은 기본 구성에서 비활성화되어 있습니다.
  • 275는 ".service" 파일입니다.
  • 나머지 부분(109)에는 ".mount", ".path", ".slice", ".socket", ".target" 접미사가 붙습니다.

다음과 같이 패키지와 일치하는 서비스 이름을 확인했다고 가정합니다.

  • 열두개 정도 있는데제공하다'@'이름에는 및 와 같이 패키지 이름에 사용되지 않는 문자가 포함되어 있습니다 '.'. 마찬가지로 모든 서비스 목록을 검색합니다.
  • 시간이 좀 걸리고(전체 목록을 처리하는 데 약 5분 정도) 목록의 220개 항목을 일치시키지 못합니다(성공률 20%).
  • 여러 개의 패키지가 발견되면서 많은 일치 항목이 우연적으로 발생합니다(이를 실패의 또 다른 70%로 간주).
  • 전체적으로 성공률은 5%이다.

반면, 이 rpm -qf방법을 사용하여 목록을 처리하는 데는 약 30초가 소요되며 100% 성공합니다.

답변3

내 원래 질문은 귀하가 필요로 하는 세부 사양을 제공하지 않았으며 귀하가 제공한 솔루션이 작동할 것이라고 생각합니다. 하지만 제 경우에는 어떤 면에서는 거의 작동하지 않습니다.

그러나 당신은 나를 올바른 길로 인도했고 다음은 내가 필요한 것을 수행합니다. 더 나은 방법이 있다고 확신하지만 적어도 작동하고 무슨 일이 일어나고 있는지 이해합니다 :)

이를 지원해 주셔서 감사합니다.

PACKAGE="mariadb-server httpd"
SERVICE="mariadb httpd"

for f in $PACKAGE
do
  if ! rpm -qa \| grep -qw ${f}
  then
    yum -y install ${f}
  fi
done

for f in $SERVICE
do
  if [ "systemctl is-active ${f}" != "active" ]
  then
    systemctl enable ${f}
    systemctl start ${f}
  fi
done

관련 정보