실행 중인 프로세스에서 상태 비트를 어떻게 확인합니까?

실행 중인 프로세스에서 상태 비트를 어떻게 확인합니까?

제 딜레마는 다음과 같습니다. 저는 Dell PowerEdge T710 서버에서 헤드리스 Ubuntu 서버 18.04.3 LTS를 실행하고 있으며 다음을 사용하여 수동으로 유지하지 않고도 Apache PHP Mod 버전을 쉽게 변경할 수 있도록 bash 스크립트를 작성하고 있습니다. -

a2dismod php<version>
a2enmod php<version>
systemctl restart apache2

스크립트의 시작 부분에서는 if 조건을 사용하여 사용자가 UID의 상태 비트를 사용하여 사용자 계정 또는 루트 계정으로 로그인했는지 확인합니다. 즉:-

if ((UID)); then
something here
elif ((!UID)); then
something here
fi

((UID))를 사용하여 비트가 true인지 확인하고 ((!UID)를 사용하여 비트가 false인지 확인하지만 여기에 문제가 있습니다. Apache가 실제로 실행 상태에서는 다음과 같은 것을 사용하는 것보다 부울 true 또는 false를 사용하는 것이 좋습니다.

systemctl status apache2

이는 많은 출력을 제공합니다. 아파치에 대한 상태 비트가 있습니까? 그런 다음 phpmod 버전 변경을 계속하기 전에 Apache가 실제로 실행되고 있는지 확인할 수 있습니다.

이것은 내가 지금까지 가지고 있는 스크립트입니다.https://pastebin.com/HyCjbn59

IT는 아파치가 실행 중인지 확인해야 할 뿐만 아니라 올바른 모듈을 활성화하기 전에 실제로 설치되어 있는지 확인하기 위해 다양한 아파치 PHP 모듈을 확인해야 합니다. 그렇지 않은 경우 스크립트가 실행됩니다.

apt install libapache2-mod-php<version>

답변1

"[r]은 하나 이상의 [유닛]이 활성화되어 있으면 종료 코드 0을 반환하고, 그렇지 않으면 0이 아닌 값을 반환합니다"라는 is-active유닛 명령을 사용할 수 있습니다 .systemctl

if systemctl is-active --quiet apache2; then
  echo running
else
  echo not running
fi

마지막 명령의 종료 코드 가 포함된 매개변수를 사용하려면 $?다음과 같이 간단하게 테스트할 수 있습니다 0.

systemctl is-active --quiet apache2
if [ $? -eq 0 ]; then
  echo running
else
  echo not running
fi

추가 읽기

답변2

자신의 종료 코드를 정의하는 것은 여전히 ​​@Dessert가 그의 답변에서 설명한 것과 동일한 논리를 사용합니다.

#!/bin/bash

systemctl is-active -q apache2 && status=TRUE || status=FALSE

case $status in
  TRUE)
    echo do something ;;
  FALSE)
    echo do sothing else ;;
esac

관련 정보