Как надежно получить временную метку при загрузке системы?

13

Я знаю о uptimeкоманде, но она возвращает секунды с момента загрузки, поэтому, если я просто вычту это число из текущей метки времени, теоретически я могу получить другой результат, если изменится секунда после того, как я прочел время работы и текущую метку времени. uptime -sэто то, что я хочу, но он не доступен на Centos (как рассчитывается, кстати?). Могу ли я просто получить ctime из / proc dir? Кажется, это дает мне правильный номер, но мне интересно, есть ли в каждой системе Linux / proc, созданный при загрузке.

пушистый
источник
Какой формат вы хотите? HH:MM:SS? Что-то другое?
Тердон
1
@terdon, метка времени UNIX
Пушистый

Ответы:

12

Прежде всего, crtimeэто сложно на Linux . Тем не менее, работает что-то вроде

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

или

$ stat -c %Z /proc/ 
1414674003

вероятно, именно то, что вам нужно. /procФайловая система определяется LFS стандартного и должна быть там для любой системы Linux, а также для большинства (все?) UNIXen.

В качестве альтернативы, если вам не нужна точность в секундах, а вам нужна только временная метка, вы можете использовать who:

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

From man who: -b, --boot время последней загрузки системы

Вы можете преобразовать это в секунды, начиная с эпохи, используя GNU date:

$ date -d "$(who -b | awk '{print $4,$3}' | tr - / )" +%s
1414674000
Тердон
источник
1
Небольшое предостережение заключается в том, что время загрузки определяется по RTC или по умолчанию, если отсутствует RTC. Это время записывается utmp(init) как запись «system boot» и читается пользователем who -b. Системное время может быть неправильным до тех пор, пока не начнется загрузка. who -bна моем RPI говорит, что он загрузился в 1970 году, а другой ARM без RTC говорит, что 2008 ;-)
mr.spuratic