14

I'm aware of the uptime command, but it returns seconds since booted, so if I just substract that number from current timestamp, in theory I can get a different result if second changes after I've read the uptime and current timestamp. uptime -s is what I want, but it is not available on centos (how is it calculated btw?). Can I just get ctime of /proc dir? This seems to give me the proper number, but I wonder if every linux system has /proc created on boot.

2
  • What format do you want? HH:MM:SS? Something else? – terdon Oct 30 '14 at 14:38
  • 1
    @terdon, UNIX timestamp – Fluffy Oct 30 '14 at 14:48
14

First of all, crtime is tricky on Linux. That said, running something like

$ stat -c %z /proc/ 
2014-10-30 14:00:03.012000000 +0100

or

$ stat -c %Z /proc/ 
1414674003

is probably exactly what you need. The /proc file system is defined by the LFS standard and should be there for any Linux system as well as for most (all?) UNIXen.

Alternatively, assuming you don't really need seconds precision, but only need the timestamp to be correct, you can use who:

$ who -b
   system boot  2014-10-30 14:00

From man who: -b, --boot time of last system boot

You can convert that to seconds since the epoch using GNU date:

$ date -d "$(who -b | awk '{print $4,$3}' | tr - / )" +%s
1414674000
1
  • 1
    A minor caveat is that the boot time is determined from the RTC, or some default if lacking an RTC. This time is written to utmp (by init) as the "system boot" entry, and read by who -b. The system time might be wrong until well into the startup. who -b on my rPi says it booted in 1970, and another RTC-less ARM says 2008 ;-) – mr.spuratic Mar 23 '17 at 10:25
2

Another solution is /proc/stat's btime [1]:

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

Example output:

1583547431

This is a seconds-since-epoch timestamp.

[1] http://man7.org/linux/man-pages/man5/proc.5.html

1
  • This solution has the advantage of not being vulnerable to RTC (real-time-clock) issues (such as noted by mr.spuratic's comment on the other answer). – Jay Sullivan May 17 '20 at 20:58
1

On macOS, /proc is unavailable, but /dev is. Here are some other options:

$ who -b
reboot   ~        Dec 17 18:45
$ stat -f %m /dev
1608227137

where -f %m specifies to show last modified time in "strftime(3) format".

$ stat -F /dev   
dr-xr-xr-x 3 root wheel 4606 Dec 17 18:45:37 2020 /dev/

If GNU tools was installed (via Homebrew), these are also available:

$ gwho -b
         system boot  2020-12-17 18:45
$ gstat -c %Y /dev
1608227137

where -c %Y specifies to show "time of last data modification, seconds since Epoch".

$ gstat -c %y /dev
2020-12-17 18:45:37.000000000 +0100

%y human readable instead.

1
  • 1
    Given that /dev is found more pervasively than /proc on UNIX and UNIX-like systems, I would submit that this is the best and most portable answer. Beware though, that who does not specify a year, nor indicate whether the time is UTC or local. – Jim L. Apr 23 at 20:24
0

The above solutions only work on computers with an RTC. On a Raspberry Pi and other embedded systems without an RTC, the system will have the reference timestamp set to 0 when the system directory structure is created. Since it is Linux we're talking about here, read the info from /proc/uptime

cat /proc/uptime | awk '{ print $1 }'

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