#!/bin/sh -e for line in $(systemctl show -p SystemState,NFailedUnits); do split_idx="$(printf "%s" "$line" | awk '{print index($0, "=")}')" property="$(printf "%s" "$line" | awk '{print substr($0, 1, '"$split_idx"' - 1)}')" value="$(printf "%s" "$line" | awk '{print substr($0, '"$split_idx"' + 1)}')" case "$property" in "SystemState") SYSTEM_STATE="$value" ;; "NFailedUnits") FAILED_UNITS="$value" ;; *) ;; esac done if [ -z "$SYSTEM_STATE" ] || [ -z "$FAILED_UNITS" ]; then echo "$0: failed to get expected data from system." >&2 exit 3 fi printf "SYSTEM %s: %d units failed.\n" "$SYSTEM_STATE" "$FAILED_UNITS" if [ "0" = "$FAILED_UNITS" ]; then exit 0 else printf "\nFailed units:\n" systemctl list-units --failed --no-legend | awk '{print "- " $1;}' exit 2 fi