systemctl의 특정 출력을 처리하는 방법은 무엇입니까?

systemctl의 특정 출력을 처리하는 방법은 무엇입니까?

저는 bash/shell 스크립팅의 초보자이고 특정 서비스를 찾을 수 없을 때 systemctl의 특정 출력을 처리하려고 합니다. 예를 들어, systemctl status xyz반환된 출력을 실행할 때 Unit xyz could not be found.서비스를 찾을 수 없는 경우 문자열을 보관하도록 변수를 업데이트하고 싶습니다 ServiceName="xyz service not found". 변수를 전혀 업데이트하고 싶지 않으며 서비스가 발견되면 변경하지 않고 그대로 둡니다.

이는 특정 서비스가 실행 중인지 확인하고 s3로 전송되는 csv 파일에 변수 출력을 저장한 다음 aws Athena를 통해 버킷을 쿼리할 수 있도록 하기 위한 노력의 일부입니다. (추가 정보를 제공하기 위해 이미 이를 구현했습니다.)

지금까지 나는 시도했다

#!/usr/bin/env bash
serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)

if [[ $serviceName$(systemctl status xyz | grep 'could not be found') ]]; then
        serviceName="xyz not found"
else
        serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)
fi

bash test.sh(제공된 코드가 포함된 파일 이름)를 실행하면 반환됩니다.

Unit xyz could not be found.
Unit xyz could not be found.
Unit xyz could not be found.

저는 다른 명령을 사용하여 이 명령을 실행하고 있으므로 실패 시 전체 스크립트가 종료되는 것을 원하지 않습니다.

미리 감사드립니다.

답변1

실행 시 systemctl status someservice다음 종료 상태가 반환될 수 있습니다 .

LSB 설명 시스템에서 사용
0 "프로그램이 실행 중이거나 서비스가 정상입니다" 장치가 활성 상태입니다.
1 "프로그램이 종료되었습니다. /var/run pid 파일이 존재합니다" 장치가 실패하지 않았습니다(is-failed에서 사용됨).
2 "프로그램이 종료되었습니다. /var/lock 잠금 파일이 존재합니다." 사용되지 않음
"프로그램이 실행되고 있지 않습니다" 장치가 활성화되지 않았습니다.
4 "프로그램이나 서비스 상태를 알 수 없습니다" 그런 유닛이 없어요

따라서 이 경우 4종료 상태에 관심이 있습니다. 그런 다음 다음 스크립트를 사용할 수 있습니다.

systemctl status xyz

if [ "$?" -eq 4 ]; then
   serviceName="xyz service not found"
fi

그런데 귀하의 경우 serviceName=$(systemctl status xyz)변수가 실제로 비어 있기 때문에 이 할당이 작동하지 않습니다(이 systemctl status작업이 실패 하면 4출력이 로 전송되기 때문입니다 stderr). 따라서 둘 다 저장하려면 다음을 stderr사용할 수 있습니다.

serviceName=$(systemctl status xyz 2>&1)

관련 정보