diff --git a/check_iowait_proc.sh b/check_iowait_proc.sh new file mode 100755 index 0000000..79db965 --- /dev/null +++ b/check_iowait_proc.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +WARNING_THRESHOLD=10 +CRITICAL_THRESHOLD=20 + +# Parse command line arguments +while getopts "w:c:" opt; do + case $opt in + w) + WARNING_THRESHOLD="$OPTARG" + ;; + c) + CRITICAL_THRESHOLD="$OPTARG" + ;; + \?) + echo "Usage: check_iowait.sh [-w warning_threshold] [-c critical_threshold]" + exit 1 + ;; + esac +done + +if ! command -v iostat &>/dev/null; then + echo "iostat not found! Please install sysstat:" + echo "sudo apt install sysstat" + exit 1 +fi + +if ! command -v iotop &>/dev/null; then + echo "iotop not found! Please install sysstat:" + echo "sudo apt install iotop" + exit 1 +fi + +# Get iowait value +iowait=$(iostat -c | awk 'NR==4 {print $4}') + +# Get process list header and top 3 processes causing iowait +header=$(iotop -b -n 1 -P -k -o | head -n 1) +top_processes=$(iotop -b -n 1 -P -k -o | tail -n +4 | head -n 3) + +# Check if there are no processes causing iowait +if [ -z "$top_processes" ]; then + top_processes="No processes causing significant iowait." +else + top_processes="$header"$'\n'"$top_processes" +fi + +iowait_str="- iowait: $iowait%"$'\n'"Top 3 processes causing iowait:" +perfdata="iowait=$iowait%;$WARNING_THRESHOLD;$CRITICAL_THRESHOLD;0;100" + +# Check if iowait is above thresholds +if (( $(echo "$iowait > $CRITICAL_THRESHOLD" | bc -l) )); then + echo "CRITICAL $iowait_str" + echo "$top_processes | $perfdata" + exit 2 +elif (( $(echo "$iowait > $WARNING_THRESHOLD" | bc -l) )); then + echo "WARNING $iowait_str" + echo "$top_processes | $perfdata" + exit 1 +else + echo -e "OK $iowait_str" + echo "$top_processes | $perfdata" + exit 0 +fi