Uzyskiwanie daty i godziny uruchomienia systemu w systemie Linux


44

Wiem, że uptimedrukuje czas, w którym maszyna była uruchomiona, ale czy istnieje łatwiejszy (niezawodny) sposób na ustalenie daty uruchomienia niż odliczanie od tego wyniku?

Próbowałem się rozejrzeć /proc, ale nie znalazłem nic istotnego. Na moim jest też taka linia dmesg:

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

Ale zastanawiam się, czy ta metoda jest niezależna od dystrybucji i wersji jądra?


Co znajduje się w unreliable or hardokoło uptime?
Bobby

2
@Bobby: Nic o komendzie lub jej funkcji jako takiej, ale, jak powiedziano, chcę uzyskać datę i godzinę ostatniego uruchomienia systemu, a nie jak długo to trwało. uptimezwraca ciąg „up 13 dni, 21:01” i od tego trzeba go policzyć.
jho

4
Odliczanie od wartości czasu sprawności jest trywialne. Jeśli chcesz niezawodny , chcesz /proc/uptime.
sam hocevar

Odpowiedzi:


40

Znalazłem tu kilka poleceń . Spróbuj who -blub last reboot | head -1.
whopodaje daty numeryczne, a last rebootzwraca skrócone nazwy dni / miesięcy.


co powiesz na to, że chcemy tylko daty i nic więcej?
T0xicCode

4
who -b | cut -d' ' -f13zwraca tylko datę (-f14 zwraca czas)
charlesbridge

2
Ostrzeżenie: last rebootnie podałem prawidłowej daty! who -bzrobił.
qwertzguy,

last rebootpodał mi również niepoprawną datę, wtmp wyglądało na obróconą pierwszego dnia miesiąca
golimar

23

To wysyła zapytanie o czas pracy z jądra i wyświetla go w lokalnej strefie czasowej:

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

Uważaj na inne opcje. lastKomenda przestanie działać tak szybko, jak wtmpzostał obrócony. whoKomenda zależy od dostępności i integralności utmp. I /proc/1może mieć bieżącą datę zamiast daty rozruchu, a nawet może być niedostępny w zahartowanym systemie. Edycja : dmesgma tylko bufor tylny o stałej długości, więc nie można go również wykonać. Dzienniki jądra mogą być włączone, /var/logale większość dystrybucji zachowuje tylko 8 tygodni.


1
Co ciekawe, nie zgadza się to z who -bminutą lub dwiema w moim systemie dostępności przez 210 dni. Wygląda jak who -bzgłoszenie znacznika czasu, podczas gdy na to liczenie wpływają dryfy zegara, nawet jeśli są one okresowo korygowane przez bieg ntpd.
Ruslan

3
Po przejrzeniu wszystkich alternatywnych odpowiedzi date -d "`cut -f1 -d. /proc/uptime` seconds ago" -uustalono na: (który ma czas / datę w UTC)
David

Fenomenalna odpowiedź. Jeśli jądro nie wie, nikt nie wie - jest to źródło prawdy dla systemu. Sekundy ułatwiają wykonywanie obliczeń czasu (natknąłem się na to, ponieważ chcę wiedzieć „Który z moich hostów nie zrestartował się w ciągu ostatniego dnia [86 400 sekund]?”)
Mike S

17

Natknąłem się na to pytanie, szukając sposobu na uzyskanie spójnego, możliwego do przeanalizowania czasu rozruchu , w przeciwieństwie do czasu od rozruchu, który zmienia się przy każdym wywołaniu.

Wygląda na to uptime -s, że sprawdzi się w większości systemów Linux.


uptime -swyjścia np 2017-08-09 01:23:45. Najlepiej jest być najprostszym. To polecenie jest zawarte w pakiecie „procps”.
teika kazura

uptimeW CentOS 6 ( procps version 3.2.8) nie wydają się potwierdzać to, niestety.
mwfearnley,

uptime -snie zawsze zwraca stałe wyniki: superuser.com/q/1247713/71144
cweiske

1
Pamiętaj, że zawsze odbywa się to w czasie lokalnym , ale tak naprawdę nie drukuje strefy czasowej / przesunięcia. Tak więc, jeśli chcesz programowo pobrać to z maszyn, nie jest to idealne rozwiązanie, ponieważ może być konieczne oddzielne określenie strefy czasowej, w zależności od przypadku użycia. Sugeruję więc kilka innych odpowiedzi.
JJC

11

Znalazłem btimelinię, /proc/statgdy trochę się rozglądałem

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

i po szybkim wyszukiwaniu znalazłem tę stronę: / proc / stat , która opisuje „Różne informacje o aktywności jądra dostępne w /proc/statpliku”.

Linia „btime” podaje czas uruchomienia systemu, w sekundach od epoki Uniksa.


1
O wiele łatwiej jest pisaćawk '/btime/{print $2}' /proc/stat
William Pursell,

@WilliamPursell najłatwiej jest zawsze tym, co już wiesz. Nie jestem czarodziejem-awk. : P
Oddstr13

Słuszna uwaga. Jednak użyłeś kota nieodpłatnie. Po prostu grep z pliku.
Mike S

@ Mike poprawnie - jednak nadal trzymam się mojego pierwotnego łańcucha poleceń jako wyraźnego przedstawienia miejsca, w którym znaleziono informacje, nawet 7 lat po mojej odpowiedzi.
Oddstr13

8
  • dobre : uptime -s, who -blub parsowanie/proc/uptime
  • złe : ls -ld /proc/1i warianty.

Nie używaj do tego celu ls -ld / proc / 1. Czasami jest aktualizowany po s2disk lub s2ram.

W moim przypadku who -bpowiedział:

uruchomienie systemu 2 maja 09:51

Podczas gdy ls -ld /proc/1:

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

ls -lddo /proclub /syswydają się utrzymywać po wznowieniu, ale jest zależna od implementacji i może się zmienić w przyszłości, więc nie stosują takich metod. A jeśli zegar systemowy jest w czasie lokalnym, a nie UTC , mają ujemne przesunięcie.

(Nie mam jeszcze prawa komentować odpowiedzi, więc otworzyłem nową odpowiedź. Przepraszam.)

EDIT: uptime -spo raz pierwszy odpowiedział w tej odpowiedzi przez mikegreiling


2

Najprostszym sposobem jest sprawdzenie, kiedy uruchomiono / sbin / init (zawsze jest to pierwszy proces uruchamiany po załadowaniu jądra):

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

Widzę więc, że mój komputer uruchomił się od 6 minut do północy 27 marca 2011 r.

Jeśli chcesz użyć go w skryptach, możesz statzamiast tego użyć polecenia:

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

Te %Yokreśla czas, ponieważ katalog Ostatnia zmiana (czas tworzenia proces) w ciągu kilku sekund od początku epoki (1/1/70) i jest standardowym unix timestamp.


1
Niestety to nie działa: mtime na tych folderach może się zmienić z innych powodów (mam tutaj system, który ma 5-dniowy czas pracy, a mtime / proc / 1 to 25 minut temu)
kdt 18.12.12

1
Nie jest to wiarygodne , jak wyjaśniono w mojej odpowiedzi
teika kazura

1

W systemie Linux

ls -ld /proc

wydaje mi się, że potrzebuję. Powyższy post jest dziwny. /proc/uptimenie zawiera wartości daty - należy ją odjąć od bieżącej godziny. Może miał na myśli:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))

uptime -spodaje wartość daty
mikegreiling

1

Pod Bash, bez rur ani innych procesów; sam tekst:

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

(Po prostu ponownie użyłem REPLYdomyślnej zmiennej, ale możesz wybrać cokolwiek potrzebujesz)


Jasne, czemu nie? Trochę sprytne wykorzystanie zmiennej podciągliwości. Chłodny. +1. Dzięki za pomysł!
Mike S

1

To wydaje się solidne i da ci je w formacie UTC i ISO8601. (Usuń dwie ostatnie opcje, aby odpowiednio wyłączyć):

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

0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(jeszcze inny sposób na zrobienie tego, co jest przydatne w pewnych okolicznościach)


0

Komenda:

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

Wynik:

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

0

Jasne i zwięzłe za pomocą polecenia 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.