<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://stab.st-andrews.ac.uk/wiki/index.php?action=history&amp;feed=atom&amp;title=Users_disk_usage</id>
		<title>Users disk usage - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://stab.st-andrews.ac.uk/wiki/index.php?action=history&amp;feed=atom&amp;title=Users_disk_usage"/>
		<link rel="alternate" type="text/html" href="http://stab.st-andrews.ac.uk/wiki/index.php?title=Users_disk_usage&amp;action=history"/>
		<updated>2026-06-03T23:27:32Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://stab.st-andrews.ac.uk/wiki/index.php?title=Users_disk_usage&amp;diff=3279&amp;oldid=prev</id>
		<title>PeterThorpe: Created page with &quot;= The following script is set to run every night via crontab =  This get the usage of each user&#039;s home directory, puts it in a file. Then calls the python script to  compare t...&quot;</title>
		<link rel="alternate" type="text/html" href="http://stab.st-andrews.ac.uk/wiki/index.php?title=Users_disk_usage&amp;diff=3279&amp;oldid=prev"/>
				<updated>2018-10-23T14:12:30Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;= The following script is set to run every night via crontab =  This get the usage of each user&amp;#039;s home directory, puts it in a file. Then calls the python script to  compare t...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= The following script is set to run every night via crontab =&lt;br /&gt;
&lt;br /&gt;
This get the usage of each user&amp;#039;s home directory, puts it in a file. Then calls the python script to &lt;br /&gt;
compare this to the previous day. &lt;br /&gt;
&lt;br /&gt;
The scripts are here: /mnt/system_usage/&lt;br /&gt;
&lt;br /&gt;
Data is in : /mnt/system_usage/data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; more users_disk_usage.sh&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #####################################################################&lt;br /&gt;
 # script to calculate the usage of all users.&lt;br /&gt;
 # report how much disc space is used.&lt;br /&gt;
 # compare users usage to yesterday.&lt;br /&gt;
 # Over time this can be plotted and we can see changes and spikes&lt;br /&gt;
 # Author: Peter Thorpe 20181013&lt;br /&gt;
 #####################################################################&lt;br /&gt;
 d=$(date +%Y_%m_%d)&lt;br /&gt;
 yest=$(date --date=&amp;quot;yesterday&amp;quot; +&amp;quot;%Y_%m_%d&amp;quot;)&lt;br /&gt;
 echo &amp;quot;$d&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 cd /mnt/system_usage&lt;br /&gt;
 &lt;br /&gt;
 # STEP: 1&lt;br /&gt;
 # get the disk space info&lt;br /&gt;
 df_cmd=&amp;quot;df &amp;gt; ./data/current_disks_status_${d}.txt&amp;quot;&lt;br /&gt;
 echo ${df_cmd}&lt;br /&gt;
 eval ${df_cmd}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # command to calc and sort the usage of all the users:&lt;br /&gt;
 cd /storage/home/users&lt;br /&gt;
 &lt;br /&gt;
 # STEP: 2&lt;br /&gt;
 #  command to calc and sort the usage of all the users:&lt;br /&gt;
 echo &amp;quot;calc: users usage.&amp;quot;&lt;br /&gt;
 # removed sort as this then requires du to have finished and&lt;br /&gt;
 # takes too long  | sort -n -rn&lt;br /&gt;
 du_cmd=&amp;quot;du -s * &amp;gt;&lt;br /&gt;
            /mnt/system_usage/data/users_usage_${d}.txt&amp;quot;&lt;br /&gt;
 echo ${du_cmd}&lt;br /&gt;
 eval ${du_cmd}&lt;br /&gt;
 wait&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # STEP: 4&lt;br /&gt;
 #  python convert bytes to human readable and compare with yesterday:&lt;br /&gt;
 cd /mnt/system_usage&lt;br /&gt;
 echo &amp;quot;chewing with python.&amp;quot;&lt;br /&gt;
 py_cmd=&amp;quot;/mnt/apps/Python3.7/bin/python3.7 compare_usage.py&lt;br /&gt;
         --today /mnt/system_usage/data/users_usage_${d}.txt&lt;br /&gt;
         --yesterday /mnt/system_usage/data/users_usage_${yest}.txt&lt;br /&gt;
         -o /mnt/system_usage/data/USAGE_and_USAGE_CHANGE_${d}.txt&amp;quot;&lt;br /&gt;
 echo ${py_cmd}&lt;br /&gt;
 eval ${py_cmd}&lt;br /&gt;
 wait&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  &amp;gt; more compare_usage.py&lt;br /&gt;
 #####!/mnt/apps/Python3.7/bin python3.7&lt;br /&gt;
 #####!/usr/bin/env python # this one is 2.6&lt;br /&gt;
 ####################################################################&lt;br /&gt;
 # title: Compare the users usage form yesterday to today&lt;br /&gt;
 # Script take in the bytes usage of the users on a linux system.&lt;br /&gt;
 # generated by: du -s * | sort -n -rn &amp;gt; users_usage_${d}.txt&lt;br /&gt;
 # The date is specified by bash: d=$(date +%Y_%m_%d).&lt;br /&gt;
 # Yesterday is specified by bash too:&lt;br /&gt;
 # yest=$(date --date=&amp;quot;yesterday&amp;quot; +&amp;quot;%Y_%m_%d&amp;quot;)&lt;br /&gt;
 # It parses the two files and compare the change in usage, and reports&lt;br /&gt;
 # human readable usage values.&lt;br /&gt;
 # Author: Peter Thorpe 20181013&lt;br /&gt;
 ###################################################################&lt;br /&gt;
 &lt;br /&gt;
 import os&lt;br /&gt;
 import sys&lt;br /&gt;
 import errno&lt;br /&gt;
 import logging&lt;br /&gt;
 import logging.handlers&lt;br /&gt;
 import sys&lt;br /&gt;
 from collections import defaultdict&lt;br /&gt;
 import argparse&lt;br /&gt;
 import datetime&lt;br /&gt;
 import time&lt;br /&gt;
 &lt;br /&gt;
 if sys.version_info[:2] != (3, 6):&lt;br /&gt;
     # e.g. sys.version_info(major=3, minor=5, micro=2,&lt;br /&gt;
     # releaselevel=&amp;#039;final&amp;#039;, serial=0)&lt;br /&gt;
     # break the program&lt;br /&gt;
     if sys.version_info[:2] != (3, 7):&lt;br /&gt;
         print(&amp;quot;currently using:&amp;quot;, sys.version_info,&lt;br /&gt;
                &amp;quot;  version of python&amp;quot;)&lt;br /&gt;
         raise ImportError(&amp;quot;Python 3.6 or 3.7 is required for &amp;quot;)&lt;br /&gt;
         sys.exit(1)&lt;br /&gt;
 VERSION = &amp;quot;&amp;quot;&amp;quot;compare usage v 0.001 \n&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 if &amp;quot;--version&amp;quot; in sys.argv:&lt;br /&gt;
     print(VERSION)&lt;br /&gt;
     sys.exit(1)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def get_args():&lt;br /&gt;
     parser = argparse.ArgumentParser(description=&amp;quot;parse usage data &amp;quot; +&lt;br /&gt;
                                      &amp;quot;comper to yesterdays &amp;quot;,&lt;br /&gt;
                                      add_help=False)&lt;br /&gt;
     file_directory = os.path.realpath(__file__).split(&amp;quot;compare_usage&amp;quot;)[0]&lt;br /&gt;
     optional = parser.add_argument_group(&amp;#039;optional arguments&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
     optional.add_argument(&amp;quot;-1&amp;quot;, &amp;quot;--yesterday&amp;quot;,&lt;br /&gt;
                           dest=&amp;#039;yesterday&amp;#039;,&lt;br /&gt;
                           action=&amp;quot;store&amp;quot;,&lt;br /&gt;
                           type=str,&lt;br /&gt;
                           default=None,&lt;br /&gt;
                           help=&amp;quot;yesterday&amp;#039;s usage file&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     optional.add_argument(&amp;quot;-2&amp;quot;, &amp;quot;--today&amp;quot;,&lt;br /&gt;
                           dest=&amp;#039;today&amp;#039;,&lt;br /&gt;
                           action=&amp;quot;store&amp;quot;,&lt;br /&gt;
                           default=None,&lt;br /&gt;
                           type=str,&lt;br /&gt;
                           help=&amp;quot;todays usage file&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     optional.add_argument(&amp;quot;-o&amp;quot;, &amp;quot;--out&amp;quot;,&lt;br /&gt;
                           dest=&amp;#039;out&amp;#039;,&lt;br /&gt;
                           action=&amp;quot;store&amp;quot;,&lt;br /&gt;
                           default=&amp;quot;usage_compared.out&amp;quot;,&lt;br /&gt;
                           type=str,&lt;br /&gt;
                           help=&amp;quot;todays usage file&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     optional.add_argument(&amp;quot;--logfile&amp;quot;,&lt;br /&gt;
                           dest=&amp;quot;logfile&amp;quot;,&lt;br /&gt;
                           action=&amp;quot;store&amp;quot;,&lt;br /&gt;
                           default=&amp;quot;usage_calculation.log&amp;quot;,&lt;br /&gt;
                           type=str,&lt;br /&gt;
                           help=&amp;quot;Logfile name&amp;quot;)&lt;br /&gt;
     args = parser.parse_args()&lt;br /&gt;
     return args, file_directory&lt;br /&gt;
 &lt;br /&gt;
 ##########################################&lt;br /&gt;
 # Functions&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def test_line(line):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;returns true lines. Not comments or blank line&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     if not line.strip():&lt;br /&gt;
         return False  # if the last line is blank&lt;br /&gt;
     if line.startswith(&amp;quot;#&amp;quot;):&lt;br /&gt;
         return False  # comment line&lt;br /&gt;
     if line.startswith(&amp;quot;    #&amp;quot;):&lt;br /&gt;
         return False  # comment line&lt;br /&gt;
     return line&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def sizeof_fmt(num, suffix=&amp;#039;B&amp;#039;):&lt;br /&gt;
     num = num * 1000&lt;br /&gt;
     for unit in [&amp;#039;&amp;#039;,&amp;#039;K&amp;#039;,&amp;#039;M&amp;#039;,&amp;#039;G&amp;#039;,&amp;#039;T&amp;#039;,&amp;#039;P&amp;#039;,&amp;#039;E&amp;#039;,&amp;#039;Z&amp;#039;]:&lt;br /&gt;
         if abs(num) &amp;lt; 1024.0:&lt;br /&gt;
             return &amp;quot;%3.1f%s%s&amp;quot; % (num, unit, suffix)&lt;br /&gt;
         num /= 1024.0&lt;br /&gt;
     return &amp;quot;%.1f%s%s&amp;quot; % (num, &amp;#039;Yi&amp;#039;, suffix)&lt;br /&gt;
 &lt;br /&gt;
 def split_line(line):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;func to split the output:&lt;br /&gt;
     in look like 59703192        /storage/home/users/pjt6/&lt;br /&gt;
     return usage and user and a list.&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     usage_bytes, user = line.split()&lt;br /&gt;
     return usage_bytes, user&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def parse_file_with_dict(handle, dictionary):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;func to populate the dic&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     for line in handle:&lt;br /&gt;
         if test_line(line):&lt;br /&gt;
             usage_bytes, user = split_line(line)&lt;br /&gt;
             dictionary[user] = usage_bytes&lt;br /&gt;
     return dictionary&lt;br /&gt;
 &lt;br /&gt;
 def get_usage_change(today, yesterday):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;func takes in the bytes of today and yesterdays usage&lt;br /&gt;
     checks the biggest value and returns the change.&lt;br /&gt;
     Positive or negatve&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     if today &amp;gt; yesterday:&lt;br /&gt;
         change = &amp;quot;+&amp;quot;&lt;br /&gt;
         usgae_change = today - yesterday&lt;br /&gt;
     else:&lt;br /&gt;
         usgae_change = yesterday - today&lt;br /&gt;
         change = &amp;quot;-&amp;quot;&lt;br /&gt;
     return usgae_change, change&lt;br /&gt;
 &lt;br /&gt;
 FILECOUNT = 0&lt;br /&gt;
 OLD_USAGE_DIC_COUNT = defaultdict(int)&lt;br /&gt;
 NEW_USAGE_DIC_COUNT = defaultdict(int)&lt;br /&gt;
 USAGE_CHANGE_DICT = defaultdict(str)&lt;br /&gt;
 &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
     # Set up logging&lt;br /&gt;
     args, FILE_DIRECTORY = get_args()&lt;br /&gt;
     cwd = os.getcwd()&lt;br /&gt;
     logger = logging.getLogger(&amp;#039;compare_usage.py: %s&amp;#039; % time.asctime())&lt;br /&gt;
     logger.setLevel(logging.DEBUG)&lt;br /&gt;
     err_handler = logging.StreamHandler(sys.stderr)&lt;br /&gt;
     err_formatter = logging.Formatter(&amp;#039;%(levelname)s: %(message)s&amp;#039;)&lt;br /&gt;
     err_handler.setFormatter(err_formatter)&lt;br /&gt;
     logger.addHandler(err_handler)&lt;br /&gt;
     if args.logfile == &amp;quot;usage_calculation.log&amp;quot;:&lt;br /&gt;
         DATE_TIME = &amp;quot;%s&amp;quot;  % (datetime.date.today())&lt;br /&gt;
         DATE_TIME = DATE_TIME.replace(&amp;quot;-&amp;quot;, &amp;quot;_&amp;quot;)&lt;br /&gt;
         args.logfile = &amp;quot;%s_usage_calculation.log&amp;quot; % (DATE_TIME)&lt;br /&gt;
     try:&lt;br /&gt;
         logstream = open(args.logfile, &amp;#039;w&amp;#039;)&lt;br /&gt;
         err_handler_file = logging.StreamHandler(logstream)&lt;br /&gt;
         err_handler_file.setFormatter(err_formatter)&lt;br /&gt;
         # logfile is always verbose&lt;br /&gt;
         err_handler_file.setLevel(logging.INFO)&lt;br /&gt;
         logger.addHandler(err_handler_file)&lt;br /&gt;
     except:&lt;br /&gt;
         outstr = &amp;quot;Could not open %s for logging&amp;quot; % args.logfile&lt;br /&gt;
         logger.error(outstr)&lt;br /&gt;
         sys.exit(1)&lt;br /&gt;
     # Report input arguments&lt;br /&gt;
     logger.info(sys.version_info)&lt;br /&gt;
     logger.info(&amp;quot;Command-line: %s&amp;quot;, &amp;#039; &amp;#039;.join(sys.argv))&lt;br /&gt;
     logger.info(&amp;quot;Starting testing: %s&amp;quot;, time.asctime())&lt;br /&gt;
     with open(args.yesterday) as handle:&lt;br /&gt;
         FILECOUNT += 1&lt;br /&gt;
 &lt;br /&gt;
         OLD_USAGE_DIC_COUNT = parse_file_with_dict(handle, OLD_USAGE_DIC_COUNT)&lt;br /&gt;
         # print(OLD_USAGE_DIC_COUNT)&lt;br /&gt;
 &lt;br /&gt;
     with open(args.today) as handle:&lt;br /&gt;
         FILECOUNT += 1&lt;br /&gt;
         NEW_USAGE_DIC_COUNT = parse_file_with_dict(handle, NEW_USAGE_DIC_COUNT)&lt;br /&gt;
     # outfile&lt;br /&gt;
     f_out = open(args.out, &amp;quot;w&amp;quot;)&lt;br /&gt;
     f_out.write(&amp;quot;user\tusage_today\tusage_yesterday\tusage_change\n&amp;quot;)&lt;br /&gt;
     # compare the values in each dict for each user:&lt;br /&gt;
     # dictionary[user] = usage_bytes&lt;br /&gt;
     for user, usage_bytes in NEW_USAGE_DIC_COUNT.items():&lt;br /&gt;
         usage_bytes = int(usage_bytes)&lt;br /&gt;
         old_bytes = OLD_USAGE_DIC_COUNT[user]&lt;br /&gt;
         old_bytes = int(old_bytes)&lt;br /&gt;
         # fucntion should return a value then + or - depending on the usage change&lt;br /&gt;
         usgae_change, change = get_usage_change(usage_bytes, old_bytes)&lt;br /&gt;
         usgae_change_human = sizeof_fmt(usgae_change)&lt;br /&gt;
         USAGE_CHANGE_DICT[user] = &amp;quot;%s%s&amp;quot; % (change, usgae_change_human)&lt;br /&gt;
         outfmt = &amp;quot;%s\t%s\t%s\t%s\n&amp;quot; % (user, sizeof_fmt(usage_bytes),&lt;br /&gt;
                                        sizeof_fmt(old_bytes),&lt;br /&gt;
                                        usgae_change_human)&lt;br /&gt;
         f_out.write(outfmt)&lt;br /&gt;
     f_out.close()&lt;/div&gt;</summary>
		<author><name>PeterThorpe</name></author>	</entry>

	</feed>