저는 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)