Revert "Add a quick little script to check a file's age"
This reverts commit 6f85b4e493
.
This commit is contained in:
parent
e7c70934f6
commit
822c5193b8
170
check_file_age
170
check_file_age
@ -1,170 +0,0 @@
|
|||||||
#! /bin/bash
|
|
||||||
#
|
|
||||||
# check_file_age
|
|
||||||
# Alerts if a file's age is beyond a specific threshold
|
|
||||||
# Copyright (C) 2021 Vintage Salt <rehashedsalt@cock.li>
|
|
||||||
#
|
|
||||||
# Distributed under terms of the MIT license.
|
|
||||||
#
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Read-only set-once variables
|
|
||||||
declare -r _name="$(basename -- "$0")"
|
|
||||||
# Options
|
|
||||||
declare -i _optcritthresh
|
|
||||||
declare -i _optwarnthresh
|
|
||||||
declare -i _opthelp
|
|
||||||
declare -i _optverbose
|
|
||||||
# Working variables
|
|
||||||
declare -a _args
|
|
||||||
declare _return
|
|
||||||
|
|
||||||
# Helper functions
|
|
||||||
log() {
|
|
||||||
# Print a line to the terminal if _optverbose is greater than $2
|
|
||||||
# $2 defaults to 0
|
|
||||||
# loglevel 0: Daily-use messages
|
|
||||||
# loglevel 1: Detailed but not quite debugging
|
|
||||||
# loglevel 2: Definitely debugging
|
|
||||||
[ -z "$1" ] && return 1
|
|
||||||
if (( _optverbose >= ${2:-0} )); then
|
|
||||||
printf "%s\\n" "$1"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
warn() {
|
|
||||||
# Print a yellow line to the terminal, respecting _optverbose
|
|
||||||
[ -z "$1" ] && return 1
|
|
||||||
if (( _optverbose >= ${2:-0} )); then
|
|
||||||
if [ -t 1 ]; then
|
|
||||||
printf "\\e[33m%s\\e[0m\\n" "$1"
|
|
||||||
else
|
|
||||||
printf "WARN: %s\\n" "$1"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
error() {
|
|
||||||
# Print a red line to the terminal, exit if $2 is specified
|
|
||||||
[ -z "$1" ] && return 1
|
|
||||||
if [ -t 2 ]; then
|
|
||||||
printf "\\e[31m%s\\e[0m\\n" "$1" 1>&2
|
|
||||||
else
|
|
||||||
printf "ERROR: %s\\n" "$1" 1>&2
|
|
||||||
fi
|
|
||||||
[ -z "$2" ] && return
|
|
||||||
exit "${2:-1}"
|
|
||||||
}
|
|
||||||
has() {
|
|
||||||
# Parse out all arguments and try to find them in path
|
|
||||||
# If an argument cannot be found, set _return and fail
|
|
||||||
for prog in "$@"; do
|
|
||||||
if ! command -v "$prog" > /dev/null 2>&1; then
|
|
||||||
_return="$prog"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Core program functions
|
|
||||||
checkage() {
|
|
||||||
# Check a file's age against the values of _optwarnthres and _optcritthresh
|
|
||||||
file="${_args[0]}"
|
|
||||||
log "Checking file $file" 1
|
|
||||||
# Get some times
|
|
||||||
filetimestamp="$(stat -c %Y -- "$file")"
|
|
||||||
now="$(date +%s)"
|
|
||||||
# Get our age
|
|
||||||
age="$(( now - filetimestamp ))"
|
|
||||||
log "File is $age seconds old" 1
|
|
||||||
# Throw out warns and crits as necessary
|
|
||||||
if (( age >= _optcritthresh )); then
|
|
||||||
echo "CRITICAL: $file is $age seconds old (max $_optcritthresh)"
|
|
||||||
exit 2
|
|
||||||
elif (( age >= _optwarnthresh)); then
|
|
||||||
echo "WARNING: $file is $age seconds old (max $_optwarnthresh)"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "OK: $file"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
printhelp() {
|
|
||||||
cat << EOF
|
|
||||||
Usage: $_name <FILE> [OPTION]...
|
|
||||||
A Nagios monitoring plugin for checking a file's age
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
FILE The file to monitor
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
-c The maximum age of the file in seconds before a CRITICAL status is
|
|
||||||
returned
|
|
||||||
-h Print this help text
|
|
||||||
-v Print more status messages. Stacks
|
|
||||||
-w The maximum age of the file in seconds before a WARNING status is
|
|
||||||
returned
|
|
||||||
|
|
||||||
Copyright (c) 2021 rehashedsalt@cock.li
|
|
||||||
Licensed under the MIT license
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main
|
|
||||||
main() {
|
|
||||||
# Parse out arguments
|
|
||||||
while [ -n "$1" ]; do
|
|
||||||
# Parse out flags
|
|
||||||
while getopts ":c:hvw:" opt; do
|
|
||||||
case $opt in
|
|
||||||
c)
|
|
||||||
_optcritthresh="$OPTARG"
|
|
||||||
;;
|
|
||||||
h)
|
|
||||||
_opthelp=1
|
|
||||||
;;
|
|
||||||
v)
|
|
||||||
_optverbose+=1
|
|
||||||
;;
|
|
||||||
w)
|
|
||||||
_optwarnthresh="$OPTARG"
|
|
||||||
;;
|
|
||||||
:)
|
|
||||||
error "Option requires argument: -$OPTARG" 2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
error "Invalid option: -$OPTARG" 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
# Store arguments
|
|
||||||
shift $((OPTIND - 1))
|
|
||||||
if [ -n "$1" ]; then
|
|
||||||
_args+=("$1")
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
unset OPTIND
|
|
||||||
done
|
|
||||||
# Early hook for help
|
|
||||||
[ -n "$_opthelp" ] && printhelp && exit 0
|
|
||||||
# Validate critical options
|
|
||||||
if [ -z "${_args[0]}" ]; then
|
|
||||||
error "Must specify a file" 50
|
|
||||||
fi
|
|
||||||
if ! (( _optcritthresh > 0 )) 2>/dev/null; then
|
|
||||||
error "Critical threshold must be an integer greater than 0" 50
|
|
||||||
fi
|
|
||||||
if ! (( _optwarnthresh > 0 )) 2>/dev/null; then
|
|
||||||
error "Warning threshold must be an integer greater than 0" 50
|
|
||||||
fi
|
|
||||||
# Validate core program dependencies
|
|
||||||
log "Validating dependencies" 2
|
|
||||||
if ! has basename; then
|
|
||||||
error "Failed to find program: $_return" 50
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do the do
|
|
||||||
checkage
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,409 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
# Heavily based on the script from:
|
|
||||||
# check_mem.pl Copyright (C) 2000 Dan Larsson <dl@tyfon.net>
|
|
||||||
# heavily modified by
|
|
||||||
# Justin Ellison <justin@techadvise.com>
|
|
||||||
#
|
|
||||||
# The MIT License (MIT)
|
|
||||||
# Copyright (c) 2011 justin@techadvise.com
|
|
||||||
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
||||||
# software and associated documentation files (the "Software"), to deal in the Software
|
|
||||||
# without restriction, including without limitation the rights to use, copy, modify,
|
|
||||||
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
# permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
# The above copyright notice and this permission notice shall be included in all copies
|
|
||||||
# or substantial portions of the Software.
|
|
||||||
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
||||||
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
|
||||||
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
|
|
||||||
# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
# OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
# Tell Perl what we need to use
|
|
||||||
use strict;
|
|
||||||
use Getopt::Std;
|
|
||||||
|
|
||||||
#TODO - Convert to Nagios::Plugin
|
|
||||||
#TODO - Use an alarm
|
|
||||||
|
|
||||||
# Predefined exit codes for Nagios
|
|
||||||
use vars qw($opt_c $opt_f $opt_u $opt_w $opt_C $opt_v $opt_h %exit_codes);
|
|
||||||
%exit_codes = ('UNKNOWN' , 3,
|
|
||||||
'OK' , 0,
|
|
||||||
'WARNING' , 1,
|
|
||||||
'CRITICAL', 2,
|
|
||||||
);
|
|
||||||
|
|
||||||
# Get our variables, do our checking:
|
|
||||||
init();
|
|
||||||
|
|
||||||
# Get the numbers:
|
|
||||||
my ($free_memory_kb,$used_memory_kb,$caches_kb,$hugepages_kb) = get_memory_info();
|
|
||||||
print "$free_memory_kb Free\n$used_memory_kb Used\n$caches_kb Cache\n" if ($opt_v);
|
|
||||||
print "$hugepages_kb Hugepages\n" if ($opt_v and $opt_h);
|
|
||||||
|
|
||||||
if ($opt_C) { #Do we count caches as free?
|
|
||||||
$used_memory_kb -= $caches_kb;
|
|
||||||
$free_memory_kb += $caches_kb;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($opt_h) {
|
|
||||||
$used_memory_kb -= $hugepages_kb;
|
|
||||||
}
|
|
||||||
|
|
||||||
print "$used_memory_kb Used (after Hugepages)\n" if ($opt_v);
|
|
||||||
|
|
||||||
# Round to the nearest KB
|
|
||||||
$free_memory_kb = sprintf('%.0f',$free_memory_kb);
|
|
||||||
$used_memory_kb = sprintf('%.0f',$used_memory_kb);
|
|
||||||
$caches_kb = sprintf('%.0f',$caches_kb);
|
|
||||||
|
|
||||||
# Tell Nagios what we came up with
|
|
||||||
tell_nagios($used_memory_kb,$free_memory_kb,$caches_kb,$hugepages_kb);
|
|
||||||
|
|
||||||
|
|
||||||
sub tell_nagios {
|
|
||||||
my ($used,$free,$caches,$hugepages) = @_;
|
|
||||||
|
|
||||||
# Calculate Total Memory
|
|
||||||
my $total = $free + $used;
|
|
||||||
print "$total Total\n" if ($opt_v);
|
|
||||||
|
|
||||||
my $perf_warn;
|
|
||||||
my $perf_crit;
|
|
||||||
if ( $opt_u ) {
|
|
||||||
$perf_warn = int(${total} * $opt_w / 100);
|
|
||||||
$perf_crit = int(${total} * $opt_c / 100);
|
|
||||||
} else {
|
|
||||||
$perf_warn = int(${total} * ( 100 - $opt_w ) / 100);
|
|
||||||
$perf_crit = int(${total} * ( 100 - $opt_c ) / 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
my $perfdata = "|TOTAL=${total}KB;;;; USED=${used}KB;${perf_warn};${perf_crit};; FREE=${free}KB;;;; CACHES=${caches}KB;;;;";
|
|
||||||
$perfdata .= " HUGEPAGES=${hugepages}KB;;;;" if ($opt_h);
|
|
||||||
|
|
||||||
if ($opt_f) {
|
|
||||||
my $percent = sprintf "%.1f", ($free / $total * 100);
|
|
||||||
if ($percent <= $opt_c) {
|
|
||||||
finish("CRITICAL - $percent% ($free kB) free!$perfdata",$exit_codes{'CRITICAL'});
|
|
||||||
}
|
|
||||||
elsif ($percent <= $opt_w) {
|
|
||||||
finish("WARNING - $percent% ($free kB) free!$perfdata",$exit_codes{'WARNING'});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
finish("OK - $percent% ($free kB) free.$perfdata",$exit_codes{'OK'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elsif ($opt_u) {
|
|
||||||
my $percent = sprintf "%.1f", ($used / $total * 100);
|
|
||||||
if ($percent >= $opt_c) {
|
|
||||||
finish("CRITICAL - $percent% ($used kB) used!$perfdata",$exit_codes{'CRITICAL'});
|
|
||||||
}
|
|
||||||
elsif ($percent >= $opt_w) {
|
|
||||||
finish("WARNING - $percent% ($used kB) used!$perfdata",$exit_codes{'WARNING'});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
finish("OK - $percent% ($used kB) used.$perfdata",$exit_codes{'OK'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show usage
|
|
||||||
sub usage() {
|
|
||||||
print "\ncheck_mem.pl v1.0 - Nagios Plugin\n\n";
|
|
||||||
print "usage:\n";
|
|
||||||
print " check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>\n\n";
|
|
||||||
print "options:\n";
|
|
||||||
print " -f Check FREE memory\n";
|
|
||||||
print " -u Check USED memory\n";
|
|
||||||
print " -C Count OS caches as FREE memory\n";
|
|
||||||
print " -h Remove hugepages from the total memory count\n";
|
|
||||||
print " -w PERCENT Percent free/used when to warn\n";
|
|
||||||
print " -c PERCENT Percent free/used when critical\n";
|
|
||||||
print "\nCopyright (C) 2000 Dan Larsson <dl\@tyfon.net>\n";
|
|
||||||
print "check_mem.pl comes with absolutely NO WARRANTY either implied or explicit\n";
|
|
||||||
print "This program is licensed under the terms of the\n";
|
|
||||||
print "MIT License (check source code for details)\n";
|
|
||||||
exit $exit_codes{'UNKNOWN'};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_memory_info {
|
|
||||||
my $used_memory_kb = 0;
|
|
||||||
my $free_memory_kb = 0;
|
|
||||||
my $total_memory_kb = 0;
|
|
||||||
my $caches_kb = 0;
|
|
||||||
my $hugepages_nr = 0;
|
|
||||||
my $hugepages_size = 0;
|
|
||||||
my $hugepages_kb = 0;
|
|
||||||
|
|
||||||
my $uname;
|
|
||||||
if ( -e '/usr/bin/uname') {
|
|
||||||
$uname = `/usr/bin/uname -a`;
|
|
||||||
}
|
|
||||||
elsif ( -e '/bin/uname') {
|
|
||||||
$uname = `/bin/uname -a`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
die "Unable to find uname in /usr/bin or /bin!\n";
|
|
||||||
}
|
|
||||||
print "uname returns $uname" if ($opt_v);
|
|
||||||
if ( $uname =~ /Linux/ ) {
|
|
||||||
my @meminfo = `/bin/cat /proc/meminfo`;
|
|
||||||
foreach (@meminfo) {
|
|
||||||
chomp;
|
|
||||||
if (/^Mem(Total|Free):\s+(\d+) kB/) {
|
|
||||||
my $counter_name = $1;
|
|
||||||
if ($counter_name eq 'Free') {
|
|
||||||
$free_memory_kb = $2;
|
|
||||||
}
|
|
||||||
elsif ($counter_name eq 'Total') {
|
|
||||||
$total_memory_kb = $2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elsif (/^(Buffers|Cached|SReclaimable):\s+(\d+) kB/) {
|
|
||||||
$caches_kb += $2;
|
|
||||||
}
|
|
||||||
elsif (/^Shmem:\s+(\d+) kB/) {
|
|
||||||
$caches_kb -= $1;
|
|
||||||
}
|
|
||||||
# These variables will most likely be overwritten once we look into
|
|
||||||
# /sys/kernel/mm/hugepages, unless we are running on linux <2.6.27
|
|
||||||
# and have to rely on them
|
|
||||||
elsif (/^HugePages_Total:\s+(\d+)/) {
|
|
||||||
$hugepages_nr = $1;
|
|
||||||
}
|
|
||||||
elsif (/^Hugepagesize:\s+(\d+) kB/) {
|
|
||||||
$hugepages_size = $1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$hugepages_kb = $hugepages_nr * $hugepages_size;
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
|
|
||||||
# Read hugepages info from the newer sysfs interface if available
|
|
||||||
my $hugepages_sysfs_dir = '/sys/kernel/mm/hugepages';
|
|
||||||
if ( -d $hugepages_sysfs_dir ) {
|
|
||||||
# Reset what we read from /proc/meminfo
|
|
||||||
$hugepages_kb = 0;
|
|
||||||
opendir(my $dh, $hugepages_sysfs_dir)
|
|
||||||
|| die "Can't open $hugepages_sysfs_dir: $!";
|
|
||||||
while (my $entry = readdir $dh) {
|
|
||||||
if ($entry =~ /^hugepages-(\d+)kB/) {
|
|
||||||
$hugepages_size = $1;
|
|
||||||
my $hugepages_nr_file = "$hugepages_sysfs_dir/$entry/nr_hugepages";
|
|
||||||
open(my $fh, '<', $hugepages_nr_file)
|
|
||||||
|| die "Can't open $hugepages_nr_file for reading: $!";
|
|
||||||
$hugepages_nr = <$fh>;
|
|
||||||
close($fh);
|
|
||||||
$hugepages_kb += $hugepages_nr * $hugepages_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir($dh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /HP-UX/ ) {
|
|
||||||
# HP-UX, thanks to Christoph Fürstaller
|
|
||||||
my @meminfo = `/usr/bin/sudo /usr/local/bin/kmeminfo`;
|
|
||||||
foreach (@meminfo) {
|
|
||||||
chomp;
|
|
||||||
if (/^Physical memory\s\s+=\s+(\d+)\s+(\d+.\d)g/) {
|
|
||||||
$total_memory_kb = ($2 * 1024 * 1024);
|
|
||||||
}
|
|
||||||
elsif (/^Free memory\s\s+=\s+(\d+)\s+(\d+.\d)g/) {
|
|
||||||
$free_memory_kb = ($2 * 1024 * 1024);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /FreeBSD/ ) {
|
|
||||||
# The FreeBSD case. 2013-03-19 www.claudiokuenzler.com
|
|
||||||
# free mem = Inactive*Page Size + Cache*Page Size + Free*Page Size
|
|
||||||
my $pagesize = `sysctl vm.stats.vm.v_page_size`;
|
|
||||||
$pagesize =~ s/[^0-9]//g;
|
|
||||||
my $mem_inactive = 0;
|
|
||||||
my $mem_cache = 0;
|
|
||||||
my $mem_free = 0;
|
|
||||||
my $mem_total = 0;
|
|
||||||
my $free_memory = 0;
|
|
||||||
my @meminfo = `/sbin/sysctl vm.stats.vm`;
|
|
||||||
foreach (@meminfo) {
|
|
||||||
chomp;
|
|
||||||
if (/^vm.stats.vm.v_inactive_count:\s+(\d+)/) {
|
|
||||||
$mem_inactive = ($1 * $pagesize);
|
|
||||||
}
|
|
||||||
elsif (/^vm.stats.vm.v_cache_count:\s+(\d+)/) {
|
|
||||||
$mem_cache = ($1 * $pagesize);
|
|
||||||
}
|
|
||||||
elsif (/^vm.stats.vm.v_free_count:\s+(\d+)/) {
|
|
||||||
$mem_free = ($1 * $pagesize);
|
|
||||||
}
|
|
||||||
elsif (/^vm.stats.vm.v_page_count:\s+(\d+)/) {
|
|
||||||
$mem_total = ($1 * $pagesize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$free_memory = $mem_inactive + $mem_cache + $mem_free;
|
|
||||||
$free_memory_kb = ( $free_memory / 1024);
|
|
||||||
$total_memory_kb = ( $mem_total / 1024);
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
$caches_kb = ($mem_cache / 1024);
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /joyent/ ) {
|
|
||||||
# The SmartOS case. 2014-01-10 www.claudiokuenzler.com
|
|
||||||
# free mem = pagesfree * pagesize
|
|
||||||
my $pagesize = `pagesize`;
|
|
||||||
my $phys_pages = `kstat -p unix:0:system_pages:pagestotal | awk '{print \$NF}'`;
|
|
||||||
my $free_pages = `kstat -p unix:0:system_pages:pagesfree | awk '{print \$NF}'`;
|
|
||||||
my $arc_size = `kstat -p zfs:0:arcstats:size | awk '{print \$NF}'`;
|
|
||||||
my $arc_size_kb = $arc_size / 1024;
|
|
||||||
|
|
||||||
print "Pagesize is $pagesize" if ($opt_v);
|
|
||||||
print "Total pages is $phys_pages" if ($opt_v);
|
|
||||||
print "Free pages is $free_pages" if ($opt_v);
|
|
||||||
print "Arc size is $arc_size" if ($opt_v);
|
|
||||||
|
|
||||||
$caches_kb += $arc_size_kb;
|
|
||||||
|
|
||||||
$total_memory_kb = $phys_pages * $pagesize / 1024;
|
|
||||||
$free_memory_kb = $free_pages * $pagesize / 1024;
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /SunOS/ ) {
|
|
||||||
eval "use Sun::Solaris::Kstat";
|
|
||||||
if ($@) { #Kstat not available
|
|
||||||
if ($opt_C) {
|
|
||||||
print "You can't report on Solaris caches without Sun::Solaris::Kstat available!\n";
|
|
||||||
exit $exit_codes{UNKNOWN};
|
|
||||||
}
|
|
||||||
my @vmstat = `/usr/bin/vmstat 1 2`;
|
|
||||||
my $line;
|
|
||||||
foreach (@vmstat) {
|
|
||||||
chomp;
|
|
||||||
$line = $_;
|
|
||||||
}
|
|
||||||
$free_memory_kb = (split(/ /,$line))[5] / 1024;
|
|
||||||
my @prtconf = `/usr/sbin/prtconf`;
|
|
||||||
foreach (@prtconf) {
|
|
||||||
if (/^Memory size: (\d+) Megabytes/) {
|
|
||||||
$total_memory_kb = $1 * 1024;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
|
|
||||||
}
|
|
||||||
else { # We have kstat
|
|
||||||
my $kstat = Sun::Solaris::Kstat->new();
|
|
||||||
my $phys_pages = ${kstat}->{unix}->{0}->{system_pages}->{physmem};
|
|
||||||
my $free_pages = ${kstat}->{unix}->{0}->{system_pages}->{freemem};
|
|
||||||
# We probably should account for UFS caching here, but it's unclear
|
|
||||||
# to me how to determine UFS's cache size. There's inode_cache,
|
|
||||||
# and maybe the physmem variable in the system_pages module??
|
|
||||||
# In the real world, it looks to be so small as not to really matter,
|
|
||||||
# so we don't grab it. If someone can give me code that does this,
|
|
||||||
# I'd be glad to put it in.
|
|
||||||
my $arc_size = (exists ${kstat}->{zfs} && ${kstat}->{zfs}->{0}->{arcstats}->{size}) ?
|
|
||||||
${kstat}->{zfs}->{0}->{arcstats}->{size} / 1024
|
|
||||||
: 0;
|
|
||||||
$caches_kb += $arc_size;
|
|
||||||
my $pagesize = `pagesize`;
|
|
||||||
|
|
||||||
$total_memory_kb = $phys_pages * $pagesize / 1024;
|
|
||||||
$free_memory_kb = $free_pages * $pagesize / 1024;
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /Darwin/ ) {
|
|
||||||
$total_memory_kb = (split(/ /,`/usr/sbin/sysctl hw.memsize`))[1]/1024;
|
|
||||||
my $pagesize = (split(/ /,`/usr/sbin/sysctl hw.pagesize`))[1];
|
|
||||||
$caches_kb = 0;
|
|
||||||
my @vm_stat = `/usr/bin/vm_stat`;
|
|
||||||
foreach (@vm_stat) {
|
|
||||||
chomp;
|
|
||||||
if (/^(Pages free):\s+(\d+)\.$/) {
|
|
||||||
$free_memory_kb = $2*$pagesize/1024;
|
|
||||||
}
|
|
||||||
# 'caching' concept works different on MACH
|
|
||||||
# this should be a reasonable approximation
|
|
||||||
elsif (/^Pages (inactive|purgable):\s+(\d+).$/) {
|
|
||||||
$caches_kb += $2*$pagesize/1024;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
}
|
|
||||||
elsif ( $uname =~ /AIX/ ) {
|
|
||||||
my @meminfo = `/usr/bin/vmstat -vh`;
|
|
||||||
foreach (@meminfo) {
|
|
||||||
chomp;
|
|
||||||
if (/^\s*([0-9.]+)\s+(.*)/) {
|
|
||||||
my $counter_name = $2;
|
|
||||||
if ($counter_name eq 'memory pages') {
|
|
||||||
$total_memory_kb = $1*4;
|
|
||||||
}
|
|
||||||
if ($counter_name eq 'free pages') {
|
|
||||||
$free_memory_kb = $1*4;
|
|
||||||
}
|
|
||||||
if ($counter_name eq 'file pages') {
|
|
||||||
$caches_kb = $1*4;
|
|
||||||
}
|
|
||||||
if ($counter_name eq 'Number of 4k page frames loaned') {
|
|
||||||
$free_memory_kb += $1*4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$used_memory_kb = $total_memory_kb - $free_memory_kb;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ($opt_C) {
|
|
||||||
print "You can't report on $uname caches!\n";
|
|
||||||
exit $exit_codes{UNKNOWN};
|
|
||||||
}
|
|
||||||
my $command_line = `vmstat | tail -1 | awk '{print \$4,\$5}'`;
|
|
||||||
chomp $command_line;
|
|
||||||
my @memlist = split(/ /, $command_line);
|
|
||||||
|
|
||||||
# Define the calculating scalars
|
|
||||||
$used_memory_kb = $memlist[0]/1024;
|
|
||||||
$free_memory_kb = $memlist[1]/1024;
|
|
||||||
$total_memory_kb = $used_memory_kb + $free_memory_kb;
|
|
||||||
}
|
|
||||||
return ($free_memory_kb,$used_memory_kb,$caches_kb,$hugepages_kb);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub init {
|
|
||||||
# Get the options
|
|
||||||
if ($#ARGV le 0) {
|
|
||||||
&usage;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
getopts('c:fuChvw:');
|
|
||||||
}
|
|
||||||
|
|
||||||
# Shortcircuit the switches
|
|
||||||
if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0) {
|
|
||||||
print "*** You must define WARN and CRITICAL levels!\n";
|
|
||||||
&usage;
|
|
||||||
}
|
|
||||||
elsif (!$opt_f and !$opt_u) {
|
|
||||||
print "*** You must select to monitor either USED or FREE memory!\n";
|
|
||||||
&usage;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if levels are sane
|
|
||||||
if ($opt_w <= $opt_c and $opt_f) {
|
|
||||||
print "*** WARN level must not be less than CRITICAL when checking FREE memory!\n";
|
|
||||||
&usage;
|
|
||||||
}
|
|
||||||
elsif ($opt_w >= $opt_c and $opt_u) {
|
|
||||||
print "*** WARN level must not be greater than CRITICAL when checking USED memory!\n";
|
|
||||||
&usage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub finish {
|
|
||||||
my ($msg,$state) = @_;
|
|
||||||
print "$msg\n";
|
|
||||||
exit $state;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user