Linux/Bash/CpuLoadAvg
cron job to capture load average
- script to call from cron
cron
* * * * * /home/<user>/cron-log-cpu.sh /home/<user>/cpu_usage.log }} * bash script cron-log-cpu.sh {{{ #!/usr/bin/bash log_file="${1:-${HOME}/cpu_usage.log}" if [[ $( awk '{ print ($1 > 2.0) }' /proc/loadavg ) -eq 1 ]]; then ( echo; date -Is; top -b -n1 -c -w | head -n 12 | grep -v "^$" ) >> ${log_file} else # Check if last update as Low loadave in last hour, should start with date if [[ -f ${log_file} ]] && tail -n 1 ${log_file} | grep -q "^$( date -Is | cut -c1-13)" > /dev/null; then : else echo echo "$( date -Is ) Low loadavg 1,5,15min $( cat /proc/loadavg )" >> ${log_file} fi fi
Log top 5 process by cpu if loadavg > 3, every minute.
Can remove echo after "||" to not log low load avg.
crontab -e
* * * * * [[ $( echo "$(awk '{ print $1 }' /proc/loadavg) > 3" |bc ) -eq 1 ]] && ( echo; date -Is; top -b -n1 -c -w | head -n 12 ) >> ~/cpu_usage.log || echo "$( date -Is ) Low loadavg 1,5,15min $( cat /proc/loadavg )" >> ~/cpu_usage.log
2nd version using if else
* * * * * if (( $( awk '{ print ($1 > 3.0) }' /proc/loadavg ) )); then ( echo; date -Is; top -b -n1 -c -w | head -n 12 ) >> ~/cpu_usage.log; else echo "$( date -Is ) Low loadavg 1,5,15min $( cat /proc/loadavg )" >> ~/cpu_usage.log; fi
view with
tail -f ~/cpu_usage.log