~/Blog

Brandon Rozek

Photo of Brandon Rozek

PhD Student @ RPI studying Automated Reasoning in AI and Linux Enthusiast.

Please monitor disk usage

Published on

2 minute reading time

You know one of the worst errors to deal with on Linux?

No space left on device

Why? Because recovery becomes really annoying. Depending on your luck, Linux may try to cache to disk even when it’s impossible causing quite a few commands to fail.

If you’re already in this situation, the best thing you can do is try to locate files to remove. You can run du -sh * in any given directory to see the sizes of files and subfolders.

Common places that hold temporary files which may be removable are:

  • /tmp
  • ~/.cache

An even better solution is to not get into this situation in the first place. For that, I introduce a bash script which sends a notification when the disk is getting full!

To see the amount of available and total space for a given $MOUNTPOINT (for example, /), we run the following:

available_space=$(df "$MOUNTPOINT" | awk 'NR==2 {print $4}')
total_space=$(df "$MOUNTPOINT" | awk 'NR==2 {print $2}')

Add a couple if statements and we have ourselves a full-blown script:

#!/bin/sh

set -o errexit
set -o nounset

MAX_USAGE_PERCENT=90

if [ -z "$MOUNTPOINT" ]; then
    echo "MOUNTPOINT variable not set or empty"
    exit 1
fi

# Get the available and total disk space for the specified mount point
available_space=$(df "$MOUNTPOINT" | awk 'NR==2 {print $4}')
total_space=$(df "$MOUNTPOINT" | awk 'NR==2 {print $2}')

# Check if the df command was successful
if [ -z "$available_space" ] || [ -z "$total_space" ]; then
    echo "Error: Could not retrieve disk space for $MOUNTPOINT"
    sendMsg "Error: Could not retrieve disk space for $MOUNTPOINT"
    exit 1
fi

usage_percent=$(( (total_space - available_space) * 100 / total_space ))

if [ $usage_percent -ge $MAX_USAGE_PERCENT ]; then
    host_name=$(hostname)
    echo "Low Disk on $host_name at mountpoint $MOUNTPOINT. Currently using ${usage_percent}% of available space."
    sendMsg "Low Disk on $host_name at mountpoint $MOUNTPOINT. Currently using ${usage_percent}% of available space."
fi

echo "Mountpoint $MOUNTPOINT is currently using ${usage_percent}% of available space."

The only part left undefined here is the sendMsg function. For me, I send a webhook notification to Zulip to both get notified and have a log of these messages.

To have this check regularly automatically, we create a systemd service and timer files.

/etc/systemd/system/lowdiskcheck.service

[Unit]
Description=Check for low disk space
Requires=network-online.target
Wants=

[Service]
Type=oneshot
# Feel free to change the mountpoint to one that you care about
Environment=MOUNTPOINT=/home
ExecStart=/usr/local/bin/lowdiskcheck.sh

[Install]
WantedBy=multi-user.target

/etc/systemd/system/lowdiskcheck.timer

[Unit]
Description=Check for low disk space daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target

Then enable the timer,

sudo systemctl enable lowdiskcheck.timer
Reply via Email Buy me a Coffee
Was this useful? Feel free to share: Hacker News Reddit Twitter

Published a response to this? :