Linux Monitor Hard Disks Temperature With hddtemp

See all GNU/Linux related FAQ
There is an excellent little utility to monitor hard drive temperature. Most modern computer hard disk including SSD comes with S.M.A.R.T (Self-Monitoring, Analysis, and Reporting Technology). It is a monitoring system for computer hard disks to detect and report on various indicators of reliability, in the hope of anticipating failures.
Advertisement

Monitor Hard Disks Temperature With hddtemp

The hddtemp or smartctl utility will give you the temperature of your hard drive by reading data from S.M.A.R.T. on drives that support this feature.
Linux Monitor Hard Disks Temperature With hddtemp
Only modern hard drives have a temperature sensor. hddtemp supports reading S.M.A.R.T. information from SCSI drives too. hddtemp can work as a simple command line tool or as a daemon to get information from all servers.

How to install hddtemp on Linux

To install hddtemp on a a Debian / Ubuntu Linux use apt-get command/apt command:
$ sudo apt-get install hddtemp
Sample outputs from my Ubuntu 20.04 LTS desktop version is as follow:

[sudo] password for vivek: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  hddtemp
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 47.7 kB of archives.
After this operation, 185 kB of additional disk space will be used.
Get:1 http://in.archive.ubuntu.com/ubuntu focal/universe amd64 hddtemp amd64 0.3-beta15-53 [47.7 kB]
Fetched 47.7 kB in 2s (30.3 kB/s)                        
Preconfiguring packages ...
Selecting previously unselected package hddtemp.
(Reading database ... 267678 files and directories currently installed.)
Preparing to unpack .../hddtemp_0.3-beta15-53_amd64.deb ...
Unpacking hddtemp (0.3-beta15-53) ...
Setting up hddtemp (0.3-beta15-53) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.19) ...

To install hddtemp under a CentOS/RHEL/SL/Oracle Linux, run yum command (first turn on EPEL repo):
$ sudo yum install hddtemp
Type the following pacman command to install hddtemp under an Arch Linux distro:
$ sudo pacman -S hddtemp
Run the following dnf command to install hddtemp under a Fedora Linux distro:
$ sudo dnf install hddtemp
Execute the following zypper command to install hddtemp under an OpenSUSE Linux distro :
$ sudo zypper install hddtemp

Related: How to check CPU temperature in OpenSUSE Linux

A note about source code installation

You can also perform source code installation. Download the source code tar ball here.
$ wget http://download.savannah.nongnu.org/releases/hddtemp/hddtemp-0.3-beta15.tar.bz2
Untar and install hddtemp using the following commands:
$ tar -jxvf hddtemp-0.3-beta15.tar.bz2
$ cd hddtemp-0.3-beta15
$ ./configure
$ make
$ sudo make install

Install hard disk temperature database at /usr/share/misc or /etc directory:
$ cd /usr/share/misc
# use the wget command to grab the db
# wget http://download.savannah.nongnu.org/releases/hddtemp/hddtemp.db

Monitor Hard Disks Temperature With hddtemp

Let us see usage, syntax and examples of hddtemp command. The syntax is
$ hddtemp disk
$ hddtemp TYPE:disk
$ hddtemp [options] TYPE:disk

TYPE could be SATA, PATA or SCSI. If omitted hddtemp will try to guess the disk type.

How do I monitor hard disk temperature on Linux?

To see temperature for the /dev/sda, enter the following command:
$ hddtemp /dev/sda
Sample outputs

/dev/sda: WDC WD2500YS-01SHB1:  25°C

Above output indicate that my hard disk temperature is 25°C. If temperature is higher than 60°C , consider cooling options immediately.

How Do I Find Out Remote Server HDD Temperature?

By default hddtemp bind to TCP/IP port 7634. You need to run hddtemp in daemon mode. Login on remote box and start it as follows to monitor /dev/sda, /dev/sdb, /dev/sdc, and /dev/sdd:
# hddtemp -d /dev/sd[abcd]
Use telnet or nc / netcat command to to get a temperature from a remote box:
$ telnet remotebox 7634
OR
$ nc 192.168.1.100 7634
Sample outputs:

|/dev/sda|Samsung SSD 850 EVO mSATA 500GB|45|C|

You can format it as follows using the awk command:
$ nc centos7-box 7634 | awk -F'|' '{print $2 " " $4 $5 "(" $3 ")"}'
Sample outputs:

/dev/sda 45C(Samsung SSD 850 EVO mSATA 500GB)

Shutdown Linux Computer If Temperature >= 55

To power off / shutdown computer, run following command via cron tab (cron job) file:
# t=$(hddtemp /dev/sda --numeric)
# [ $t -ge 55 ] && /sbin/shutdown -h 0

Sample shell script to shutdown box if temperature >= 55°C (download link):

#!/bin/bash
# Purpose: Shutdown server if disk temp crossed $ALERT_LEVEL
# Author: Vivek Gite {https://www.cyberciti.biz/}, under GPL v.2.x
# -----------------------------------------------------------------
HDDS="/dev/sda /dev/sdb /dev/sdc /dev/sdc /dev/sdd /dev/sde"
HDT=/usr/sbin/hddtemp
LOG=/usr/bin/logger
DOWN=/sbin/shutdown
ALERT_LEVEL=60
for disk in $HDDS
do
  if [ -b $disk ]; then
        HDTEMP=$( ${HDT} --numeric ${disk} )
        if [ $HDTEMP -ge $ALERT_LEVEL ];
        then
           $LOG "System going down as hard disk \"$disk\" temperature ($HDTEMP) crossed its limit."
           sync;sync
           $DOWN -h 0
        fi
  fi
done

You can run script using a cron job on Linux or Unix-like system:
$ sudo crontab -e
Append the following to run cron job every 10 minutes to check for disk temp:
*/10 * * * * /root/bin/chk-disk-temp.bash

hddtemp command options

To see usage, run:
$ hddtemp --help
Sample outputs:

  -b   --drivebase   :  display database file content that allow hddtemp to
                        recognize supported drives.
  -D   --debug       :  display various S.M.A.R.T. fields and their values.
                        Useful to find a value that seems to match the
                        temperature and/or to send me a report.
                        (done for every drive supplied).
  -d   --daemon      :  run hddtemp in TCP/IP daemon mode (port 7634 by default.)
  -f   --file=FILE   :  specify database file to use.
  -F   --foreground  :  don't daemonize, stay in foreground.
  -l   --listen=addr :  listen on a specific interface (in TCP/IP daemon mode).
  -n   --numeric     :  print only the temperature.
  -p   --port=#      :  port to listen to (in TCP/IP daemon mode).
  -s   --separator=C :  separator to use between fields (in TCP/IP daemon mode).
  -S   --syslog=s    :  log temperature to syslog every s seconds.
  -u   --unit=[C|F]  :  force output temperature either in Celsius or Fahrenheit.
  -q   --quiet       :  do not check if the drive is supported.
  -v   --version     :  display hddtemp version number.
  -w   --wake-up     :  wake-up the drive if need.
  -4                 :  listen on IPv4 sockets only.
  -6                 :  listen on IPv6 sockets only.

A note about NVME SSD

We can use the smartctl command or nvme command to get temperature. For instance:
$ sudo smartctl -A /dev/nvme0
Here is what I see:

smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.18.0-25-generic] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org
 
=== START OF SMART DATA SECTION ===
SMART/Health Information (NVMe Log 0x02, NSID 0xffffffff)
Critical Warning:                   0x00
Temperature:                        41 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    0%
Data Units Read:                    15,889 [8.13 GB]
Data Units Written:                 80,845 [41.3 GB]
Host Read Commands:                 256,531
Host Write Commands:                553,980
Controller Busy Time:               3
Power Cycles:                       38
Power On Hours:                     4
Unsafe Shutdowns:                   27
Media and Data Integrity Errors:    0
Error Information Log Entries:      41
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 1:               41 Celsius
Temperature Sensor 2:               45 Celsius

Another option is to try out nvme command to read nvme ssd temperature as follows:
$ sudo nvme smart-log /dev/nvme0
Here is what I saw from my Linux laptop:

Smart Log for NVME device:nvme0 namespace-id:ffffffff
critical_warning                    : 0
temperature                         : 41 C
available_spare                     : 100%
available_spare_threshold           : 10%
percentage_used                     : 0%
data_units_read                     : 15,889
data_units_written                  : 80,841
host_read_commands                  : 2,56,531
host_write_commands                 : 5,53,822
controller_busy_time                : 3
power_cycles                        : 38
power_on_hours                      : 4
unsafe_shutdowns                    : 27
media_errors                        : 0
num_err_log_entries                 : 41
Warning Temperature Time            : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1                : 41 C
Temperature Sensor 2                : 45 C
Thermal Management T1 Trans Count   : 0
Thermal Management T2 Trans Count   : 0
Thermal Management T1 Total Time    : 0
Thermal Management T2 Total Time    : 0

See “Linux find NVMe SSD temperature using command line” for more info.

Say hello to smartctl Utility

If you have smartctl utility installed, try it as follows to get temperature data:
# smartctl -d ata -A /dev/sda | grep -i temperature
# smartctl -A /dev/sdb | grep -i temperature

Linux Find Hard Disk Temperature Command
Set ALERT_LEVEL as per your requirements. Please refer to your hard disk manual for working temperature guideline. Here is general temperature guideline (extracted from Seagate SV35.2 Series Hard Drives Web Page):

Operating 0 to 60 degrees C
Nonoperating -40 to 70 degrees C
Maximum operating temperature change 20 degrees C per hour
Maximum nonoperating temperature change 30 degrees C per hour
Maximum operating case temperature 69 degrees C

Gnome GUI based disks & storage tool

Type the following command:
$ gnome-disks
Click on the Disk and it will show you disk temperature as follows:
Monitor Hard Disks Temperature With hddtemp and Gnome Disks

A note for MS-Windows XP / Vista/ 7 / 10 / 11 Server Users

Sorry. The hddtemp is UNIX / Linux only program.

Conclusion

You learned how to monitor hard disks temperature with hddtemp, smartctl and GUI tool. For more information see:

🥺 Was this helpful? Please add a comment to show your appreciation or feedback.

nixCrat Tux Pixel Penguin
Hi! 🤠
I'm Vivek Gite, and I write about Linux, macOS, Unix, IT, programming, infosec, and open source. Subscribe to my RSS feed or email newsletter for updates.

32 comments… add one
  • mark Sep 26, 2011 @ 16:01

    Not working on USB drives

    hddtemp /dev/sde
    /dev/sde: WD Ext HDD 1021: S.M.A.R.T. not available

    • Melody Sep 26, 2014 @ 7:25

      sudo smartctl -d auto -A /dev/sdb | grep -i temperature

      where sdb is an external usb drive (this was a usb 3.0 connection)

  • d4m1r Aug 2, 2012 @ 0:31

    Created the below script in a file (called check-hddtemp) in /usr/local/sbin/ and set it to run every 30min in my Ubuntu Server 11.10’s crontab file (in /etc/). Script is below and so is more information how to set it up.

    #!/bin/bash
    HDDS="/dev/sda"
    HDT=/usr/sbin/hddtemp
    LOG=/usr/bin/logger
    DOWN=/sbin/shutdown
    ALERT_LEVEL=50
    args="--numeric"
    for disk in $HDDS
    do
    if [ -b $disk ]; then
    HDTEMP=$($HDT $disk $args)
    $LOG "HDTEMP for $disk is $HDTEMP"
    if [ $HDTEMP -ge $ALERT_LEVEL ]; then
    $LOG "System going down due hard disk : $disk temperature $HDTEMP exceeded its limit"
    sync;sync
    $DOWN -h 0
    fi
    fi
    done
    

    http://ubuntuforums.org/showthread.php?p=12144858

  • Piotr Opara May 20, 2013 @ 8:59

    Hi
    Insted of:
    HDTEMP=$($HDT $disk | awk ‘{ print $4}’ | awk -F ‘°’ ‘{ print $1}’)
    try use
    HDTEMP=$($HDT -n $disk | awk ‘{ print $1}’)

  • Rafal Nov 18, 2014 @ 2:59

    For Windows users, you can download smartmontools for Windows (free) http://www.smartmontools.org/wiki/Download#InstalltheWindowspackage instead of using a trial version of hddtemp. Then create check.bat to check the temp and if it reaches the max level, use the shutdown command plus some echo command to a log file.

  • Andre Aug 3, 2022 @ 19:08

    How do i activate smartctrol in this script for use in unraid and Dell R710? It works with cpu temp, but i also want nvme temp to be included in the average temp limit.

    This is part of my working script:

    #for hdd temp
    #$ smartctl --all /dev/sdb | grep -i temperature
    #for nvme temp
    #$ smartctl --all /dev/nvme0 | grep -i temperature
    

    Oneline command to get uptimes to A, B & C. Friend wrote this oneliner, need to write explanation what it does and why it does it.

    read A B C <<<$(LC_ALL=C uptime | egrep -o 'average:.+' | cut -d : -f 2- | sed 's/,//g;')
    #convert float numbers to integers by removing everything after . dot
    A=${A%.*}
    B=${B%.*}
    C=${C%.*}
    #The fanspeeds are adjussted to keep the last cpu ~65C @ 25C ambient.
    # VERY LOW
    if [[ $A -le 4 && $B -le 4 && $C -le 4 ]]
    then
    
            echo 'cpu load very low'
    
    		echo 'Setting fan speeds to 10%'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0xA
    
    # LOW
    
    elif [[ $A -le 8 && $B -le 4 && $C -le 4 ]]
    
    then
    
            echo 'cpu load low'
    
    		echo 'Setting fan speeds to 25%'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x19
    
    # MODERATE
    
    elif [[ $A -le 12 && $B -le 8 && $C -le 4 ]]
    
    then
    
            echo 'cpu load moderate'
    
    		echo 'Setting fan speeds to 50%'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x32
    
    #HIGH
    
    elif [[ $A -le 16 && $B -le 12 && $C -le 8 ]]
    
    then
    
            echo 'cpu load high'
    
    		echo 'Setting fan speeds to 60% and 9240 RPM'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x3c
    
    #VERY HIGH
    
    elif [[ $A -le 24 && $B -le 16 && $C -le 12 ]]
    
    then 
    
            echo 'cpu load very high'
    
    		echo 'Setting fan speeds to 70% and 10000 RPM'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x46
    
    #BEYOND VERY HIGH
    
    elif [[ $A -le 24 && $B -le 20 && $C -le 16 ]]
    
    then
    
    		echo 'cpu load beyond very high'
    
    		echo 'Setting fan speeds to 80% and 11760 RPM'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x50
    
    #ONE STEP FROM HELL
    
    elif [[ $A -le 24 && $B -le 24 && $C -le 20 ]]
    
    then
    
    		echo 'cpu load one step from hell'
    
    		echo 'Setting fan speeds to 90% and 12840 to 12960 RPM'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x5a
    
    #MAX LOAD 64 is for 100%. I Use 37 because it is stuck on bucle up and 3c will keep cpu temp under 65 C on full load. 37 is 55%
    
    else
    
    		echo 'cpu load max reached, buckle up'
    
    		echo 'Setting fan speeds to 100% and 14160 to 14400 RPM'
    
    		ipmitool -I lanplus -N 1 -R 1 -H $IPMIHOST -U $IPMIUSER -P $IPMIPW raw 0x30 0x30 0x02 0xff 0x64
    fi
    

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre> for code samples. Your comment will appear only after approval by the site admin.