In January 2015 I created a post about automatically creating a status page for a Linux server that I have. Typically this is put under a restricted directory and allows you to see a snapshot of what is happening with the server. I run it by putting the scripts in the /etc/cron.hourly directory on a Linux PC and a Raspberry Pi running Linux.
It serves as a simple way to check up on the server without having to use a tool such as Webmin that requires a login. It also keeps a trail of log files that get rotated on a monthly basis, so there is always a few old ones around to track down any problems and patterns in the operation.
I have found this information useful when I have traced down malfunctions that can occur when setting up a server and also when I was trying to get a webcam up and running and had the USB bus hang up a few times when the cam was overloaded with too much light.
In the new script file I fixed a bug by adding parenthesis around a line that I was trying to echo and I added code to run the w command to show a quick picture on who is logged in, how long the server has been up and running and the values for the average load on the server at the 1, 5 and 15 minute marks.
Logcreate Script
#!/bin/dash # Remove old log rm /var/www/status/log.txt # Print logged outputs into new log.txt date >> /var/www/status/log.txt echo >> /var/www/status/log.txt tail /var/log/syslog >> /var/www/status/log.txt echo >> /var/www/status/log.txt free >> /var/www/status/log.txt echo >> /var/www/status/log.txt df -h >> /var/www/status/log.txt echo >> /var/www/status/log.txt # Top memory using processes http://www.commandlinefu.com/commands/view/3/display-the-top-ten-running-processes-sorted-by-memory-usage #ps aux | sort -nk +4 | tail >> log.txt echo "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND" >> /var/www/status/log.txt ps aux | sort -nrk 4 | head >> /var/www/status/log.txt echo >> /var/www/status/log.txt # Logged in User info using w command w >> /var/www/status/log.txt echo >> /var/www/status/log.txt echo >> /var/www/status/log.txt # Copy log.txt into the full log that is collected cat /var/www/status/log.txt >> /var/www/status/fulllog.txt # Create a free standind copy of the process tree pstree > /var/www/status/pstree.txt
Alternate Version
I also created a version of the script for a desktop Linux PC that does not have Apache installed. In it I use a DIR variable to contain the directory that I want the log.txt file stored.
#!/bin/dash # User defined variables # No trailing / on DIR! DIR=/home/erick/status # Remove old log rm $DIR/log.txt # Print logged outputs into new log.txt date >> $DIR/log.txt echo >> $DIR/log.txt tail /var/log/syslog >> $DIR/log.txt echo >> $DIR/log.txt free >> $DIR/log.txt echo >> $DIR/log.txt df -h >> $DIR/log.txt echo >> $DIR/log.txt # Top memory using processes http://www.commandlinefu.com/commands/view/3/display-the-top-ten-running-processes-sorted-by-memory-usage #ps aux | sort -nk +4 | tail >> log.txt echo "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND" >> $DIR/log.txt ps aux | sort -nrk 4 | head >> $DIR/log.txt echo >> $DIR/log.txt # Logged in User info using w command w >> $DIR/log.txt echo >> $DIR/log.txt echo >> $DIR/log.txt # Copy log.txt into the full log that is collected cat $DIR/log.txt >> $DIR/fulllog.txt # Create a free standing copy of the process tree pstree > $DIR/pstree.txt
Rotation of Log
In the /etc/cron.monthly directory I have created a file that is called status-log-rotate and it will save backup copies of 2 months worth of the full concatenated server status logs.
#! /bin/bash DIR=/home/erick/status mv $DIR/fulllog.txt.1 $DIR/fulllog.txt.2 mv $DIR/fulllog.txt $DIR/fulllog.txt.1
Tweaks for Raspberry Pi
For the Raspberry Pi which has an SD card that I am trying to be conscious of writing to often. I have recently made some modifications to put the /tmp folder onto RAM using tmpfs. I create the hourly log underneath a folder there. Daily via a script it cron.hourly it gets concatenated into a daily log which is under a status folder that has restricted access. This gets appended once per day to the fulllog which actually lives on the SD card. The end result, no multiple hourly writes to the log file, just one append to the full log per day. The only downside is if the power drops and then some log entries will be lost for the day.
Logcreate runs from /etc/cron.hourly for Raspberry Pi
#!/bin/dash # Set DIR, on Pi this is a temp location for log DIR=/tmp/web # Set fixed DIR FIXDIR for files that have to be stored on SD card # Nevermind, just make a daily log and then copy that to the full log daily. #FIXDIR=/var/www/status # Remove old log rm $DIR/log.txt # Print logged outputs into new log.txt date >> $DIR/log.txt echo >> $DIR/log.txt tail /var/log/syslog >> $DIR/log.txt echo >> $DIR/log.txt free >> $DIR/log.txt echo >> $DIR/log.txt df -h >> $DIR/log.txt echo >> $DIR/log.txt # Top memory using processes http://www.commandlinefu.com/commands/view/3/display-the-top-ten-running-processes-sorted-by-memory-usage echo "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND" >> $DIR/log.txt ps aux | sort -nrk 4 | head >> $DIR/log.txt echo >> $DIR/log.txt # Logged in User info using w command w >> $DIR/log.txt echo >> $DIR/log.txt echo >> $DIR/log.txt # Copy log.txt into the full log that is collected cat $DIR/log.txt >> $DIR/dailylog.txt # Create a free standing copy of the process tree pstree > $DIR/pstree.txt
dailylog-to-fulllog script, runs from /etc/cron.daily
#! /bin/bash DIR=/tmp/web FIXDIR=/var/www/status echo "----------------------------------------------" >> $DIR/dailylog.txt date >> $DIR/dailylog.txt echo "----------------------------------------------" >> $DIR/dailylog.txt cat $DIR/dailylog.txt >> $FIXDIR/fulllog.txt rm $DIR/dailylog.txt
Logcreate Output from Raspberry Pi
Below is what the logcreate script will output to the log.txt file on a Raspberry Pi that I have running as a web server.
Sun Jul 12 14:17:01 EDT 2015 Jul 12 13:47:51 raspberrypi dhclient: DHCPACK from 192.168.1.1 Jul 12 13:47:52 raspberrypi dhclient: bound to 192.168.1.17 -- renewal in 40673 seconds. Jul 12 13:59:01 raspberrypi /USR/SBIN/CRON[28010]: (erick) CMD (aplay /opt/sonic-pi/etc/samples/guit_e_fifths.wav) Jul 12 13:59:07 raspberrypi /USR/SBIN/CRON[28009]: (CRON) info (No MTA installed, discarding output) Jul 12 14:00:01 raspberrypi /USR/SBIN/CRON[28013]: (erick) CMD (/home/erick/fswebcam/cron-timelapse.sh >> timelapse.log) Jul 12 14:00:23 raspberrypi /USR/SBIN/CRON[28012]: (CRON) info (No MTA installed, discarding output) Jul 12 14:01:01 raspberrypi /USR/SBIN/CRON[28022]: (root) CMD (/home/erick/bin/usbreset /dev/bus/usb/001/004) Jul 12 14:01:02 raspberrypi /USR/SBIN/CRON[28021]: (CRON) info (No MTA installed, discarding output) Jul 12 14:09:01 raspberrypi /USR/SBIN/CRON[28053]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)) Jul 12 14:17:01 raspberrypi /USR/SBIN/CRON[28064]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) total used free shared buffers cached Mem: 445804 424488 21316 0 106768 260516 -/+ buffers/cache: 57204 388600 Swap: 102396 0 102396 Filesystem Size Used Avail Use% Mounted on rootfs 6.3G 3.1G 3.0G 51% / /dev/root 6.3G 3.1G 3.0G 51% / devtmpfs 214M 0 214M 0% /dev tmpfs 44M 240K 44M 1% /run tmpfs 5.0M 8.0K 5.0M 1% /run/lock tmpfs 88M 0 88M 0% /run/shm /dev/mmcblk0p5 60M 19M 41M 32% /boot USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2071 0.0 3.0 24896 13652 ? Ss Jun28 2:24 /usr/sbin/apache2 -k start www-data 27745 0.0 1.5 25412 7084 ? S 09:58 0:00 /usr/sbin/apache2 -k start www-data 27744 0.0 1.5 24960 6760 ? S 09:58 0:00 /usr/sbin/apache2 -k start www-data 27743 0.0 1.5 25428 7116 ? S 09:58 0:00 /usr/sbin/apache2 -k start www-data 27742 0.0 1.5 25396 7036 ? S 09:58 0:00 /usr/sbin/apache2 -k start www-data 27538 0.0 1.5 25396 7032 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 27502 0.0 1.5 25404 7036 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 27501 0.0 1.5 25396 7044 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 27747 0.0 1.3 24936 6188 ? S 09:58 0:00 /usr/sbin/apache2 -k start www-data 27746 0.0 1.3 24936 6188 ? S 09:58 0:00 /usr/sbin/apache2 -k start 14:17:02 up 14 days, 12:56, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT erick pts/0 192.168.1.5 14:04 10:39 1.70s 1.70s -bash