Получение даты и времени запуска системы в Linux

44

Я знаю, что uptimeпечатает время, когда машина была запущена и работает, но есть ли более простой (надежный) способ получения даты запуска, чем обратный отсчет с этого вывода?

Я попытался осмотреться /proc, но не нашел ничего актуального. На моем сайте также есть такая строка dmesg:

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

Но мне интересно, является ли этот метод независимым от распространения и версии ядра?

Jho
источник
Что unreliable or hardо uptime?
Бобби
2
@Bobby: Ничего о команде или ее функции как таковой, но, как я уже сказал, я хочу получить дату и время последней загрузки системы, а не то, как долго она работала с тех пор. uptimeвозвращает строку типа «до 13 дней, 21:01», и вам нужно посчитать ее из этого.
Jho
4
Это обратный отсчет от значения времени безотказной работы. Если вы хотите надежного , вы хотите /proc/uptime.
Сэм Хочевар

Ответы:

40

Я нашел несколько команд здесь . Попробуйте who -bили last reboot | head -1.
whoдает числовые даты, а last rebootвозвращает сокращенные названия дней / месяцев.

charlesbridge
источник
как насчет того, если мы хотим только дату и ничего больше?
T0xicCode
4
who -b | cut -d' ' -f13возвращается только дата (-f14 время возврата)
charlesbridge
2
Предупреждение: last rebootне дал мне правильную дату! who -bсделал.
qwertzguy
last rebootдал мне неправильную дату, wtmp, похоже, был повернут в первый день месяца
golimar
23

Это запрашивает время безотказной работы ядра и отображает его в местном часовом поясе:

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

Будьте осторожны с другими вариантами. Команда lastперестанет работать, как только wtmpбудет повернут. Команда whoзависит от доступности и целостности utmp. И /proc/1может иметь текущую дату вместо даты времени загрузки, и даже может быть недоступен в защищенной системе. Редактировать : dmesgимеет только задний буфер фиксированной длины, так что это тоже нереально. Журналы ядра могут быть, /var/logно большинство дистрибутивов хранят их только 8 недель.

Сэм Хоцевар
источник
1
Интересно, что это не согласуется с who -bминутой или двумя в моей системе с 210-дневным временем безотказной работы. Похоже, who -bсообщает отметку времени, в то время как на этот подсчет как-то влияют смещения часов, даже если они периодически корректируются бегом ntpd.
Руслан
3
Изучив все альтернативные ответы, остановился на: date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u(который имеет время / дату в UTC)
david6
Феноменальный ответ. Если ядро ​​не знает, никто не знает - это Источник Истины для системы. Секунды облегчают выполнение вычислений времени (я наткнулся на это, потому что хочу знать, «Кто из моих хостов не перезагрузился в течение последнего дня [86 400 секунд]?»)
Майк С
17

Я наткнулся на этот вопрос, когда искал способ получить согласованное, разбираемое время загрузки , а не время после загрузки, которое меняется при каждом вызове.

Похоже, что uptime -sдобьется цели в большинстве систем Linux.

mikegreiling
источник
uptime -sвыходы напр 2017-08-09 01:23:45. Это лучше всего, будучи самым простым. Эта команда входит в пакет «procps».
Тейка Казура
К сожалению, uptimeв CentOS 6 ( procps version 3.2.8) это не поддерживается.
mwfearnley
uptime -sне всегда возвращает постоянные результаты: superuser.com/q/1247713/71144
cweiske
1
Обратите внимание, что это всегда местное время , но на самом деле оно не печатает часовой пояс / смещение. Так что, если вы хотите получить это с компьютеров программным способом, это не идеально, так как вам может потребоваться отдельно определить их часовой пояс, в зависимости от вашего варианта использования. Итак, я бы предложил некоторые другие ответы.
JJC
11

Я нашел btimeлинию, /proc/statкогда немного ковыряюсь

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

и после быстрого поиска я нашел эту страницу: / proc / stat объяснена , которая обрисовывает в общих чертах "Различные части информации о деятельности ядра, которые доступны в /proc/statфайле".

Строка «btime» показывает время загрузки системы в секундах с начала эпохи Unix.

Oddstr13
источник
1
Кажется, гораздо легче написатьawk '/btime/{print $2}' /proc/stat
Уильям Перселл
@WilliamPursell проще всего всегда то, что вы уже знаете. Я не волшебник awk. : P
Oddstr13
Хорошая точка зрения. Тем не менее, вы использовали кошку безвозмездно. Просто grep из файла.
Майк С
@MikeS правильно - однако я все еще поддерживаю свою исходную цепочку команд как четкое представление о том, где находится информация, даже спустя 7 лет после моего ответа.
Oddstr13
8
  • хорошо : uptime -s, who -bили синтаксический/proc/uptime
  • плохо : ls -ld /proc/1и варианты.

Не используйте ls -ld / proc / 1 для этой цели. Иногда обновляется после s2disk или s2ram.

В моем случае who -bсказано:

загрузка системы 2 мая 09:51

Пока ls -ld /proc/1:

dr-xr-xr-x 7 root root 0 мая 3 13:09 / proc / 1

ls -ldдля /procили , /sysкажется, сохраняются после возобновления, но зависит от его реализации, и может измениться в будущем, так что не использовать такие методы. И если ваши системные часы имеют местное время, а не UTC , они имеют отрицательное смещение.

(У меня пока нет права комментировать ответы, поэтому открыл новый ответ. Извините.)

EDIT: uptime -sсначала ответил на этот ответ на mikegreiling

Тейка Казура
источник
2

Самый простой способ - посмотреть, когда был запущен / sbin / init (это всегда первый процесс, запускаемый после загрузки ядра):

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

Итак, я вижу, что моя машина загрузилась в 6 минут до полуночи 27 марта 2011 года.

Если вы хотите использовать его в сценариях, вы можете использовать statкоманду вместо:

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

В %YОпределяет время , поскольку каталог последнего изменения (время создания процесса) в секундах с начала эпохи (1/1/70) и является стандартным Отметка времени Unix.

Majenko
источник
1
К сожалению, это не работает: mtime для этих папок может измениться по другим причинам (у меня есть система с 5-дневным временем безотказной работы, а mtime из / proc / 1 25 минут назад)
kdt
1
Это не надежно , как объяснил в моем ответе
Тейка Казура
1

В Linux

ls -ld /proc

кажется, дает мне то, что мне нужно. Пост выше странный. /proc/uptimeне содержит значения даты - оно должно быть вычтено из текущего времени. Может быть, он имел в виду:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))
Gerry
источник
uptime -sпредоставляет значение даты
mikegreiling
1

Под Bash, без труб и прочих процессов; просто текст:

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

(Просто повторно использовали REPLYпеременную по умолчанию, но вы можете выбрать все, что вам нужно)

Luchostein
источник
Конечно, почему нет? В некотором роде умное использование переменной подстранности. Круто. +1. Спасибо за идею!
Майк С
1

Это кажется надежным и даст вам в формате UTC и ISO8601. (Удалите два последних параметра, чтобы отключить их соответственно):

date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u -Iseconds
JJC
источник
0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(еще один способ сделать это, который полезен в определенных обстоятельствах)

AmanicA
источник
0

Команда:

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

Выход:

 Currently: 2016-05-09  9:06:29
  Up Since: 2016-05-04 12:56:04
  Duration: up 4 days, 20 hours, 10 minutes
LonnieBest
источник
0

Четко и кратко с командой tuptime :

# 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
Rfraile
источник