icinga2-checks/check_systemd_service.sh

75 lines
2.1 KiB
Bash
Raw Normal View History

#!/bin/bash
function usage {
echo "Usage:
-u [UNIT name]
-t Service is triggered by a timer or is a oneshot service. Is allowed to be inactive"
}
UNIT_NAME=""
IS_TIMER=false
# Parse command line arguments
while getopts "u:t" opt; do
case ${opt} in
u )
UNIT_NAME=$OPTARG
;;
t )
IS_TIMER=true
;;
\? )
echo "Invalid option: $OPTARG" 1>&2
exit 1
;;
: )
echo "Invalid option: $OPTARG requires an argument" 1>&2
exit 1
;;
esac
done
shift $((OPTIND -1))
# Check if UNIT name is provided
if [ -z "$UNIT_NAME" ]; then
usage
exit -1
fi
# Check if the unit is enabled
enabled=$(systemctl is-enabled "$UNIT_NAME")
if [ "$enabled" != "enabled" ]; then
echo "CRITICAL - $UNIT_NAME is not enabled"
exit 2
fi
# Check if the unit is active
active=$(systemctl is-active "$UNIT_NAME")
substate=$(systemctl show "$UNIT_NAME" --property=SubState --value)
exit_code=$(systemctl show "$UNIT_NAME" --property=ExecMainStatus --value)
if [ "$active" = "activating" ]; then
echo "WARNING - $UNIT_NAME is activating"
exit 1
elif [ "$active" != "active" ] && [ "$IS_TIMER" = false ]; then
echo "CRITICAL - $UNIT_NAME is not active"
exit 2
elif [ "$IS_TIMER" = true ] && [ "$active" = "inactive" ] && [ "$exit_code" != "0" ]; then
echo "CRITICAL - $UNIT_NAME is inactive with non-zero exit code"
exit 2
fi
# Get service start time
start_time=$(systemctl show "$UNIT_NAME" --property=ExecMainStartTimestamp --value)
end_time=$(systemctl show "$UNIT_NAME" --property=ExecMainExitTimestamp --value)
current_time=$(date +%s)
start_time_diff=$((current_time - $(date -d "$start_time" +%s)))
end_time_diff=$((current_time - $(date -d "$end_time" +%s)))
if [ "$IS_TIMER" = true ] && { [ "$substate" = "exited" ] || [ "$active" = "inactive" ]; }; then
echo "OK - $UNIT_NAME is active and exited (returned $exit_code) and enabled. Exited at $end_time. | downtime=${end_time_diff}s"
else
echo "OK - $UNIT_NAME is active and enabled. Started at $start_time. | uptime=${start_time_diff}s"
fi
exit 0