check free memory in FreeBSD

In case you’re coming from Linux world to FreeBSD first of all: Welcome!

You might miss some commands, like free.
Here is a very short tutorial for that.

fetch https://raw.githubusercontent.com/ocochard/myscripts/master/FreeBSD/freebsd-memory.sh

sh freebsd-memory.sh

Then of course you can make it executable and move it to a proper place, whatever is in your path: /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin

All the credit for the script goes to Ralf S. Engelschall
In case someone would remove the file from githubusercontent.com here is the script:

#!/bin/sh

# Display memory usage information on FreeBSD
# This function is a shell re-writting of the perl script:
## freebsd-memory — List Total System Memory Usage
## Copyright (c) 2003-2004 Ralf S. Engelschall <rse@engelschall.com>
## http://www.cyberciti.biz/files/scripts/freebsd-memory.pl.txt

# round the physical memory size to the next power of two which is
# reasonable for memory cards. We do this by first determining the
# guessed memory card size under the assumption that usual computer
# hardware has an average of a maximally eight memory cards installed
# and those are usually of equal size.

# Strict script
set -e
set -u

mem_rounded () {
mem_size=$1
chip_size=1
chip_guess=`echo “$mem_size / 8 – 1” | bc`
while [ $chip_guess != 0 ]
do
chip_guess=`echo “$chip_guess / 2” | bc`
chip_size=`echo “$chip_size * 2” | bc`
done
mem_round=`echo “( $mem_size / $chip_size + 1 ) * $chip_size” | bc`
echo $mem_round
exit 0
}

free_memory () {
# determine the individual known information
# NOTICE: forget hw.usermem, it is just (hw.physmem – vm.stats.vm.v_wire_count).
# NOTICE: forget vm.stats.misc.zero_page_count, it is just the subset of
# vm.stats.vm.v_free_count which is already pre-zeroed.
mem_phys=`sysctl -n hw.physmem`
set +e
mem_hw=`mem_rounded $mem_phys`
set -e
sysctl_pagesize=`sysctl -n hw.pagesize`
mem_all=`echo “\`sysctl -n vm.stats.vm.v_page_count\` \
* $sysctl_pagesize” | bc`
mem_wire=`echo “\`sysctl -n vm.stats.vm.v_wire_count\` \
* $sysctl_pagesize” | bc`
mem_active=`echo “\`sysctl -n vm.stats.vm.v_active_count\` \
* $sysctl_pagesize” | bc`
mem_inactive=`echo “\`sysctl -n vm.stats.vm.v_inactive_count\` \
* $sysctl_pagesize” | bc`
mem_cache=`echo “\`sysctl -n vm.stats.vm.v_cache_count\` \
* $sysctl_pagesize” | bc`
mem_free=`echo “\`sysctl -n vm.stats.vm.v_free_count\` \
* $sysctl_pagesize” | bc`

# determine the individual unknown information
mem_gap_vm=`echo “$mem_all – ( $mem_wire + $mem_active + \
$mem_inactive + $mem_cache + $mem_free )” | bc`
mem_gap_sys=`echo “$mem_phys – $mem_all” | bc`
mem_gap_hw=`echo “$mem_hw – $mem_phys” | bc`

# determine logical summary information
mem_total=$mem_hw
mem_avail=`echo “$mem_inactive + $mem_cache + $mem_free” | bc`
mem_used=`echo “$mem_total – $mem_avail” | bc`

# print system results
printf “SYSTEM MEMORY INFORMATION:\n”
printf “mem_wire: %12d (%7dMB) [%3d%%] %s\n” $mem_wire \
`echo “$mem_wire / ( 1024 * 1024 )” | bc` `echo “$mem_wire \
* 100 / $mem_all” | bc` “Wired: disabled for paging out”
printf “mem_active: + %12d (%7dMB) [%3d%%] %s\n” $mem_active \
`echo “$mem_active / ( 1024 * 1024 )” | bc` `echo “$mem_active \
* 100 / $mem_all” | bc` “Active: recently referenced”
printf “mem_inactive:+ %12d (%7dMB) [%3d%%] %s\n” $mem_inactive \
`echo “$mem_inactive / ( 1024 * 1024 )” | bc` `echo “$mem_inactive \
* 100 / $mem_all” | bc` “Inactive: recently not referenced”
printf “mem_cache: + %12d (%7dMB) [%3d%%] %s\n” $mem_cache \
`echo “$mem_cache / ( 1024 * 1024 )” | bc` `echo “$mem_cache \
* 100 / $mem_all” | bc` “Cached: almost avail. for allocation”
printf “mem_free: + %12d (%7dMB) [%3d%%] %s\n” $mem_free \
`echo “$mem_free / ( 1024 * 1024 )” | bc` `echo “$mem_free \
* 100 / $mem_all” | bc` “Free: fully available for allocation”
printf “mem_gap_vm: + %12d (%7dMB) [%3d%%] %s\n” $mem_gap_vm \
`echo “$mem_gap_vm / ( 1024 * 1024 )” | bc` `echo “$mem_gap_vm \
* 100 / $mem_all” | bc` “Memory gap: UNKNOWN”
printf “______________ ____________ ___________ ______\n”
printf “mem_all: = %12d (%7dMB) [100%%] %s\n” $mem_all \
`echo “$mem_all / ( 1024 * 1024 )” | bc` “Total real memory managed”
printf “mem_gap_sys: + %12d (%7dMB) %s\n” $mem_gap_sys \
`echo “$mem_gap_sys / ( 1024 * 1024 )” | bc` “Memory gap: Kernel?!”
printf “______________ ____________ ___________\n”
printf “mem_phys: = %12d (%7dMB) %s\n” $mem_phys \
`echo “$mem_phys / ( 1024 * 1024 )” | bc` “Total real memory available”
printf “mem_gap_hw: + %12d (%7dMB) %s\n” $mem_gap_hw \
`echo “$mem_gap_hw / ( 1024 * 1024 )” | bc` “Memory gap: Segment Mappings?!”
printf “______________ ____________ ___________\n”
printf “mem_hw: = %12d (%7dMB) %s\n” $mem_hw \
`echo “$mem_hw / ( 1024 * 1024 )” | bc` “Total real memory installed”
# print logical results
printf “\n”
printf “SYSTEM MEMORY SUMMARY:\n”
printf “mem_used: %12d (%7dMB) [%3d%%] %s\n” $mem_used \
`echo “$mem_used / ( 1024 * 1024 )” | bc` `echo “$mem_used \
* 100 / $mem_total” | bc` “Logically used memory”
printf “mem_avail: + %12d (%7dMB) [%3d%%] %s\n” $mem_avail \
`echo “$mem_avail / ( 1024 * 1024 )” | bc` `echo “$mem_avail \
* 100 / $mem_total” | bc` “Logically available memory”
printf “______________ ____________ __________ _______\n”
printf “mem_total: = %12d (%7dMB) [100%%] %s\n” $mem_total \
`echo “$mem_total / ( 1024 * 1024 )” | bc` “Logically total memory”
exit 0
}

###################
## Main function ##
###################

free_memory

Advertisements

Removing broken packages on Debian

Recently I had this issue with a Debian server.

apt-get autoremove broke some packages and I was not able to remove them either with apt-get remove, dpkg -P or dpkg –remove –force-remove-reinstreq

What I did was the following:

  • cd /var/lib/dpkg/info
  • rm package_name.*
  • dpkg –purge –force-remove-reinstreq

Then everything was neat 😉

NagiosQL

If you’ve ever gotten close to Nagios or Icinga then it is almost sure that you’ve also had to work with NagiosQL or something alike

It gave me a headache to configure properly Icinga and NagiosQL on Debian Wheezy. The point where I was stuck was making Icinga to actually use the configuration files generated by NagiosQL. In all of the tutorials I’ve found they are telling you to change something in nagios.cfg. But since the new version of Icinga 1 (Icinga 1.10) the nagios.cfg has been renamed to icinga.cfg and you can find it under /etc/icinga/icinga.cfg. Also, the hosts directory is called objects.
So in order to make NagiosQL and Icinga work together, after installing NagiosQL you have to change the following in /etc/icinga/icinga.cfg:

  • cfg_dir=/etc/nagios-plugins/config -> cfg_dir=/etc/nagiosql/config
  • cfg_dir=/etc/icinga/objects/ -> cfg_dir=/etc/nagiosql/hosts
  • You might also have to copy the /etc/icinga/objects/*.cfg files from /etc/icinga to /etc/nagiosql, you will find out if it is required or not when you start Icinga.
    By the way, this only solves the hosts, if you want to edit services as well through NagiosQL then that is a whole different issue.

    That’s it. In case you have questions feel free to ask, I’ll try to reply asap./p>