55

I know that uptime prints the time a machine has been up and running, but is there an easier (reliable) way to get the date of the start up than counting down from this output?

I tried looking around /proc, but didn't find anything of relevance. There's also a line like this on my dmesg:

[    0.673492] rtc_cmos rtc_cmos: setting system clock to 2011-03-14 14:26:52 UTC (1300112812)

But I'm wondering if this method is distribution and kernel version agnostic?

3
  • What's unreliable or hard about uptime?
    – Bobby
    Mar 28, 2011 at 11:25
  • 4
    @Bobby: Nothing about the command or its function per se, but as said I want to get the date and time of last system boot, not how long it's been up since. uptime returns a string like "up 13 days, 21:01", and you'd need to count it from that.
    – jho
    Mar 28, 2011 at 11:29
  • 4
    It's trivial to count back from the uptime value. If you want reliable, you want /proc/uptime. Mar 28, 2011 at 14:29

13 Answers 13

53

I found some commands here. Try who -b or last reboot | head -1.
who gives numeric dates, while last reboot returns abbreviated day / month names.

4
  • how about if we only want the date and nothing else?
    – T0xicCode
    May 8, 2012 at 3:00
  • 5
    who -b | cut -d' ' -f13 returns date only (-f14 returns time) May 8, 2012 at 11:15
  • 3
    Warning: last reboot did not give me the correct date ! who -b did.
    – qwertzguy
    Sep 18, 2013 at 18:08
  • last reboot gave me an incorrect date too, wtmp seemed to have been rotated first day of the month
    – golimar
    Feb 17, 2015 at 15:54
27

This queries the uptime from the kernel and displays it in the local timezone:

date -d "`cut -f1 -d. /proc/uptime` seconds ago"

Be careful about other options. The last command will stop working as soon as wtmp has been rotated. The who command depends on the availability and integrity of utmp. And /proc/1 might have the current date instead of the boot time date, and could even be unavailable on a hardened system. Edit: dmesg only has a fixed-length back buffer, so it is unrealiable, too. The kernel logs may be in /var/log but most distributions only keep 8 weeks of them.

4
  • 1
    Interestingly, this disagrees with who -b by a minute or two on my 210-days-uptime system. Looks like who -b reports a time stamp, while this counting is somehow affected by clock drifts, even if these are periodically corrected by a running ntpd.
    – Ruslan
    Aug 27, 2014 at 9:11
  • 3
    After reviewing all the alternate answers, settled on: date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u (which has time/date in UTC)
    – david6
    Jan 14, 2016 at 22:32
  • Phenomenal answer. If the kernel don't know, nobody knows- it's the Source of Truth for the system. The seconds make it easy to perform time calculations (I stumbled on this because I want to know "Which of my hosts didn't reboot within the last day [86,400 seconds]?")
    – Mike S
    Jun 3, 2018 at 3:13
  • I have a machine with a faulty RTC (realtime clock), where the clock is only correctly set after boot. who -b reports the time with the faulty time. /proc/uptime by definition of the calculation will report the actual boot time.
    – nak
    Jul 19, 2023 at 15:12
25

I stumbled on this question while looking for a way to get a consistent, parseable boot time, as opposed to time since boot which changes on every call.

It appears that uptime -s will do the trick on most linux systems.

4
  • uptime -s outputs e.g. 2017-08-09 01:23:45. This is best, by being simplest. This command is included in the package "procps". Apr 8, 2018 at 12:34
  • 1
    The uptime in CentOS 6 (procps version 3.2.8) does not seem to support this, sadly.
    – mwfearnley
    Dec 3, 2018 at 10:43
  • 1
    uptime -s does not always return constant results: superuser.com/q/1247713/71144
    – cweiske
    Jan 18, 2019 at 9:26
  • 1
    Note that this is always in localtime, but it does not actually print the timezone/offset. So, if you're looking to pull this from machines programmatically, it's not ideal, as you may need to separately determine their timezone, depending on your use case. So, I'd suggest some of the other answers.
    – JJC
    Apr 25, 2019 at 0:53
12

I found the btime line in /proc/stat when poking around a bit

cat /proc/stat | grep btime | awk '{ print $2 }'

and after a quick search, I found this page: /proc/stat explained, which outlines the "Various pieces of information about kernel activity that are available in the /proc/stat file."

The "btime" line gives the time at which the system booted, in seconds since the Unix epoch.

4
  • 1
    Seems a lot easier to write awk '/btime/{print $2}' /proc/stat Jun 12, 2017 at 14:07
  • @WilliamPursell easiest is always what you already know. I am no awk wizard. :P
    – Oddstr13
    Jun 12, 2017 at 19:37
  • Good point. However, you used cat gratuitously. Just grep from the file.
    – Mike S
    Jun 3, 2018 at 3:18
  • @MikeS correct – however, I still stand by my original command chain as a clear representation of where the information is found, even 7 years after my answer.
    – Oddstr13
    Jun 3, 2018 at 8:20
9
  • good: uptime -s, who -b or parsing /proc/uptime
  • bad: ls -ld /proc/1 and variants.

Don't use ls -ld /proc/1 for this purpose. It's sometimes updated after s2disk or s2ram.

In my case, who -b said:

system boot May 2 09:51

While ls -ld /proc/1:

dr-xr-xr-x 7 root root 0 May 3 13:09 /proc/1

ls -ld for /proc or /sys seem to persist after resuming, but it's implementation dependent, and may change in future, so don't use such methods. And if your system clock is in localtime, not UTC, they have negative offset.

(I don't have the privilege to comment to answers yet, so opened a new answer. Sorry.)

EDIT: uptime -s was first answered in this answer by mikegreiling

2

The simplest way is to look to see when /sbin/init started (that's always the first process to be started after the kernel loads):

# ls -ld /proc/1
dr-xr-xr-x 7 root root 0 2011-03-27 23:54 /proc/1

So I can see that my machine booted up at 6 minutes to midnight on the 27th of March 2011.

If you want to use it in scripting you can use the stat command instead:

# stat --printf='%Y' /proc/1
1301266491

The %Y specifies the time since the directory was last changed (process creation time) in seconds since the epoch (1/1/70) and is a standard unix timestamp.

2
  • 1
    Unfortunately this doesn't work: the mtime on those folders can change for other reasons (I have a system here that has a 5 day uptime and the mtime of /proc/1 is 25 minutes ago)
    – kdt
    Dec 18, 2012 at 13:10
  • 1
    It's not reliable, as explained in my answer Feb 13, 2015 at 5:46
2

This seems robust and will give it to you in UTC and ISO8601 format. (Remove the last two options to disable either, respectively):

date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u -Iseconds
1

In Linux,

ls -ld /proc

seems to give me what I need. The post above is odd. /proc/uptime does not contain a date value – it would have to be subtracted from the current time. Maybe he meant:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))
1
  • uptime -s provides a date value Nov 1, 2014 at 20:56
1

Under Bash, without pipes nor other processes; just text:

$ REPLY="$(</proc/uptime)"
$ REPLY="${REPLY%%.*}"
$ echo "$REPLY"
31207

(Just reused the REPLY default variable, but you can choose whatever you need)

1
  • Sure, Why not? Kinda clever use of variable substringiness. Cool. +1. Thanks for the idea!
    – Mike S
    Jun 3, 2018 at 3:24
0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(yet another way to do this, which is useful in certain circumstances)

0

Command:

(echo ' Currently:' | tr "\n" ' ' ; date +"%Y-%m-%d %k:%M:%S" ; echo '  Up Since:' | tr '\n' ' ' ; uptime -s ; echo '  Duration:' | tr '\n' ' ' ; uptime -p)

Output:

 Currently: 2016-05-09  9:06:29
  Up Since: 2016-05-04 12:56:04
  Duration: up 4 days, 20 hours, 10 minutes
0

Clear and concise with tuptime command:

# tuptime -t
No.             Startup Date                                          Uptime            Shutdown Date   End                    Downtime

1     09:43:39 AM 08/08/2017      41 days, 0 hours, 51 minutes and 2 seconds   10:34:41 AM 09/18/2017    OK                  10 seconds
2     10:34:51 AM 09/18/2017                         1 minute and 16 seconds   10:36:07 AM 09/18/2017    OK                    1 second
3     10:36:08 AM 09/18/2017                       13 minutes and 20 seconds   10:49:28 AM 09/18/2017    OK                   3 seconds
4     10:49:31 AM 09/18/2017       45 days, 0 hours, 1 minute and 20 seconds   09:50:51 AM 11/02/2017    OK                   4 seconds
5     09:50:55 AM 11/02/2017                       27 minutes and 25 seconds   10:18:20 AM 11/02/2017    OK                   4 seconds
6     10:18:24 AM 11/02/2017                                       9 seconds   10:18:33 AM 11/02/2017    OK                   9 seconds
7     10:18:42 AM 11/02/2017      4 days, 5 hours, 41 minutes and 47 seconds   04:00:29 PM 11/06/2017    OK                  44 seconds
8     04:01:13 PM 11/06/2017    15 days, 17 hours, 33 minutes and 48 seconds   09:35:01 AM 11/22/2017   BAD   10 minutes and 40 seconds
9     09:45:41 AM 11/22/2017               8 hours, 9 minutes and 20 seconds   05:55:01 PM 11/22/2017   BAD     7 minutes and 8 seconds
10    06:02:09 PM 11/22/2017                1 hour, 7 minutes and 54 seconds   07:10:03 PM 11/22/2017   BAD   11 minutes and 30 seconds
11    07:21:33 PM 11/22/2017               1 hour, 58 minutes and 32 seconds   09:20:05 PM 11/22/2017    OK                   5 seconds
12    09:20:10 PM 11/22/2017                       14 minutes and 52 seconds   09:35:02 PM 11/22/2017   BAD    5 minutes and 52 seconds
13    09:40:54 PM 11/22/2017                         4 minutes and 6 seconds   09:45:00 PM 11/22/2017   BAD    4 minutes and 51 seconds
14    09:49:51 PM 11/22/2017             11 hours, 15 minutes and 10 seconds   09:05:01 AM 11/23/2017   BAD    7 minutes and 20 seconds
15    09:12:21 AM 11/23/2017      3 days, 2 hours, 17 minutes and 40 seconds   11:30:01 AM 11/26/2017   BAD   27 minutes and 44 seconds
16    11:57:45 AM 11/26/2017   109 days, 19 hours, 12 minutes and 37 seconds   07:10:22 AM 03/16/2018    OK                  17 seconds
17    07:10:39 AM 03/16/2018     25 days, 3 hours, 55 minutes and 59 seconds   12:06:38 PM 04/10/2018    OK                   3 seconds
18    12:06:41 PM 04/10/2018      8 days, 19 hours, 3 minutes and 20 seconds   07:10:01 AM 04/19/2018   BAD    3 minutes and 52 seconds
19    07:13:53 AM 04/19/2018     77 days, 9 hours, 44 minutes and 39 seconds
2
  • tuptime is not available by default.
    – not2savvy
    Sep 8, 2021 at 10:20
  • It is available on the repository of the mayor Linux distributions. An apt install tuptime, dnf install tuptime, apk add tuptime, pkg install tuptime, etc... set up it on the system.
    – rfmoz
    Apr 9, 2022 at 15:41
0

On improving this answer, as that variant prints out inconsistent values for the second depending on when being executed due to truncating the value of /proc/uptime.

This variant does not truncate hence seems to provide a consistent value:

date -d "`cut -f1 -d' ' /proc/uptime` seconds ago" -u -Iseconds

Tested with date (GNU coreutils) 9.1. Consistency tested with: while date -d "`cut -f1 -d ' ' /proc/uptime` seconds ago" -u -Iseconds; do :; done | uniq

(This may would have been a comment, but I have not enough reputation here yet.)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .