Currently, I have my server output my uptime to a HTML page using:

TIME=$(uptime -p) echo ""${TIME}"!" >> /var/www/html/index.new

Which generates an output of:

up 1 day, 1 hour, 2 minutes!

I would like to also (for the sake of curiosity) to be able to display my system's record uptime, though am uncertain as to the best way to log this and display it back in the (uptime -p) [day, hr, min] format.

Is there a pre-existing tool which can do this? Or would I need to log uptime to a file and pull out the highest value with grep or something similar?


After installing 'uptimed', I have added the following few lines to my script:

uprecords | head -n 4 | tail -n 1 | awk '{print "Current uptime record is " $3,$4$5,$6" (hr:mis:sec)"}'

Current uptime record is 1 day, 02:05:34 (hr:min:sec)

This should be more than suitable for my needs.

| improve this answer | |

I would suggest using the -s flag to get a parsable time of when the system started. And then use date and subtraction.

Keep doing this in a loop and compare it against the record. The record time needs to be saved to file of course.

(The record file needs to be initialized. echo 0 > record)

As long as this script keeps running, anything can simply read the record file to find out what the current record is.


format_time ()

    days=$(($t / 86400))
    t=$(($t - 86400*$days))

    hours=$(($t / 3600))
    t=$(($t - 3600*$hours))

    minutes=$(($t / 60))
    t=$(($t - 60*$minutes))

    echo "$days days $hours hours $minutes minutes $t seconds"

main ()
    # Old record
    record="$(cat record)"

    # When the system started.
    boot="$(date -d "$(uptime -s)" '+%s')"
    while true; do
        # You could also calculate the uptime before the loop and just
        # increment it, but that will rely on the script running 24/7.
        now="$(date '+%s')"
        current_uptime="$(($now - $boot))"
        # Set and save the record when it gets beaten
        if [ "$current_uptime" -gt "$record" ]; then
            echo "$record" > record
        # Status should be printed _after_ potentially having set
        # a new record:
        echo "Current uptime: $(format_time "$current_uptime")"
        echo "Record uptime: $(format_time "$record")"
        # Don't waste system resources for silly things.
        sleep 1

| improve this answer | |

Since you're already using uptimed, you could also install uprecords-cgi which presents the information stored by uptimed in a web page; by default it will be enabled at http://localhost/cgi-bin/uprecords.cgi.

| improve this answer | |

Using tuptime and you will get a clear report with historical information:

tuptime > /var/www/html/index.new

And you will get something similar to this:

No.             Startup Date                                        Uptime            Shutdown Date   End                   Downtime

1     08:48:09 AM 07/12/2019                       2 minutes and 5 seconds   08:50:14 AM 07/12/2019   OK    2 minutes and 42 seconds
2     08:52:56 AM 07/12/2019   55 days, 6 hours, 18 minutes and 42 seconds

If you have PHP installed, also you can use one wrapper available on the official repo to show it prettier:

enter image description here

Disclose: I'm the author of the sofware.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.