Mendapatkan tanggal dan waktu startup sistem di Linux

44

Saya tahu bahwa uptimemencetak waktu mesin telah dinyalakan dan dijalankan, tetapi adakah cara yang lebih mudah (andal) untuk mendapatkan tanggal memulai daripada menghitung mundur dari hasil ini?

Saya mencoba melihat-lihat /proc, tetapi tidak menemukan sesuatu yang relevan. Ada juga garis seperti ini di saya dmesg:

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

Tetapi saya bertanya-tanya apakah metode ini adalah agnostik versi distribusi dan kernel?

jho
sumber
Apa unreliable or hardtentang uptime?
Bobby
2
@ Bob: Tidak ada tentang perintah atau fungsinya sendiri, tetapi seperti yang saya katakan, saya ingin mendapatkan tanggal dan waktu boot sistem terakhir, tidak berapa lama sejak itu. uptimemengembalikan string seperti "hingga 13 hari, 21:01", dan Anda harus menghitungnya dari itu.
jho
4
Itu sepele untuk menghitung mundur dari nilai uptime. Jika Anda ingin dapat diandalkan , Anda ingin /proc/uptime.
sam hocevar

Jawaban:

40

Saya menemukan beberapa perintah di sini . Coba who -batau last reboot | head -1.
whomemberikan tanggal numerik, sementara last rebootmengembalikan nama hari / bulan yang disingkat.

jembatan Charles
sumber
bagaimana kalau kita hanya ingin kencan dan tidak ada yang lain?
T0xicCode
4
who -b | cut -d' ' -f13hanya tanggal pengembalian (-f14 waktu pengembalian)
charlesbridge
2
Peringatan: last reboottidak memberi saya tanggal yang benar! who -bmelakukan.
qwertzguy
last rebootmemberiku tanggal yang salah juga, wtmp tampaknya telah diputar hari pertama bulan itu
golimar
23

Ini menanyakan waktu aktif dari kernel dan menampilkannya di zona waktu lokal:

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

Hati-hati dengan pilihan lain. The lastperintah akan berhenti bekerja secepat wtmptelah diputar. The whoperintah tergantung pada ketersediaan dan integritas utmp. Dan /proc/1mungkin memiliki tanggal saat ini daripada tanggal waktu boot, dan bahkan bisa tidak tersedia pada sistem yang diperkeras. Sunting : dmesghanya memiliki penyangga punggung panjang tetap, sehingga tidak dapat dibatalkan juga. Kernel log mungkin ada /var/logtetapi kebanyakan distribusi hanya menyimpannya selama 8 minggu.

sam hocevar
sumber
1
Menariknya, ini tidak setuju dengan who -bsatu atau dua menit pada sistem uptime 210 hari saya. Sepertinya who -bmelaporkan stempel waktu, sementara penghitungan ini entah bagaimana dipengaruhi oleh drift jam, meskipun ini secara berkala diperbaiki dengan menjalankan ntpd.
Ruslan
3
Setelah meninjau semua jawaban alternatif, diselesaikan pada: date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u(yang memiliki waktu / tanggal di UTC)
david6
Jawaban fenomenal. Jika kernel tidak tahu, tidak ada yang tahu - ini adalah Sumber Kebenaran untuk sistem. Detik membuatnya mudah untuk melakukan perhitungan waktu (saya menemukan ini karena saya ingin tahu "Yang mana dari host saya yang tidak reboot dalam hari terakhir [86.400 detik]?")
Mike S
17

Saya tersandung pada pertanyaan ini sambil mencari cara untuk mendapatkan waktu boot yang konsisten dan dapat diuraikan , sebagai lawan waktu sejak boot yang berubah pada setiap panggilan.

Tampaknya uptime -sakan melakukan trik pada kebanyakan sistem linux.

mikegreiling
sumber
uptime -soutput misalnya 2017-08-09 01:23:45. Ini yang terbaik, dengan menjadi yang paling sederhana. Perintah ini termasuk dalam paket "procps".
teika kazura
The uptimedi CentOS 6 ( procps version 3.2.8) tampaknya tidak mendukung ini, sedih.
mwfearnley
uptime -stidak selalu memberikan hasil konstan: superuser.com/q/1247713/71144
cweiske
1
Perhatikan bahwa ini selalu di localtime , tetapi tidak benar-benar mencetak zona waktu / offset. Jadi, jika Anda ingin menarik ini dari mesin secara terprogram, itu tidak ideal, karena Anda mungkin perlu menentukan zona waktu mereka secara terpisah, tergantung pada kasus penggunaan Anda. Jadi, saya sarankan beberapa jawaban lain.
JJC
11

Saya menemukan btimegaris /proc/statketika menusuk sedikit

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

dan setelah pencarian cepat, saya menemukan halaman ini: / proc / stat menjelaskan , yang menguraikan "Berbagai informasi tentang aktivitas kernel yang tersedia dalam /proc/statfile."

Baris "btime" memberikan waktu di mana sistem boot, dalam detik sejak zaman Unix.

Ganjalan13
sumber
1
Tampaknya jauh lebih mudah untuk menulisawk '/btime/{print $2}' /proc/stat
William Pursell
@WilliamPursell termudah selalu apa yang sudah Anda ketahui. Saya bukan penyihir awk. : P
Oddstr13
Poin bagus. Namun, Anda menggunakan kucing dengan bebas. Cukup ambil dari file.
Mike S
@ Mike benar - namun, saya masih berdiri dengan rantai perintah asli saya sebagai representasi yang jelas dari mana informasi itu ditemukan, bahkan 7 tahun setelah jawaban saya.
Oddstr13
8
  • baik : uptime -s, who -batau parsing/proc/uptime
  • buruk : ls -ld /proc/1dan varian.

Jangan gunakan ls -ld / proc / 1 untuk tujuan ini. Terkadang diperbarui setelah s2disk atau s2ram.

Dalam kasus saya, who -bkatakan:

boot sistem 2 Mei 09:51

Sementara ls -ld /proc/1:

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

ls -lduntuk /procatau /systampaknya bertahan setelah melanjutkan, tetapi implementasi tergantung, dan dapat berubah di masa depan, jadi jangan gunakan metode seperti itu. Dan jika jam sistem Anda dalam waktu lokal, bukan UTC , mereka memiliki offset negatif.

(Saya belum memiliki hak istimewa untuk mengomentari jawaban, jadi buka jawaban baru. Maaf.)

EDIT: uptime -spertama kali dijawab dalam jawaban ini oleh mikegreiling

teika kazura
sumber
2

Cara paling sederhana adalah dengan melihat kapan / sbin / init dimulai (itu selalu proses pertama yang dimulai setelah kernel dimuat):

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

Jadi saya dapat melihat bahwa mesin saya boot pada 6 menit hingga tengah malam pada tanggal 27 Maret 2011.

Jika Anda ingin menggunakannya dalam skrip, Anda dapat menggunakan statperintah sebagai gantinya:

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

The %Ymenspesifikasikan waktu sejak direktori terakhir diubah (waktu penciptaan proses) dalam hitungan detik sejak zaman (1/1/70) dan merupakan unix timestamp standar.

Majenko
sumber
1
Sayangnya ini tidak berfungsi: mtime pada folder tersebut dapat berubah karena alasan lain (saya memiliki sistem di sini yang memiliki uptime 5 hari dan mtime dari / proc / 1 adalah 25 menit yang lalu)
kdt
1
Itu tidak dapat diandalkan , seperti yang dijelaskan dalam jawaban saya
teika kazura
1

Di Linux,

ls -ld /proc

tampaknya memberi saya apa yang saya butuhkan. Posting di atas aneh. /proc/uptimetidak mengandung nilai tanggal - itu harus dikurangi dari waktu saat ini. Mungkin maksudnya:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))
gerry
sumber
uptime -smemberikan nilai tanggal
mikegreiling
1

Di bawah Bash, tanpa pipa atau proses lainnya; hanya teks:

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

(Hanya menggunakan kembali REPLYvariabel default, tetapi Anda dapat memilih apa pun yang Anda butuhkan)

Luchostein
sumber
Tentu saja mengapa tidak? Agak pandai menggunakan substringiness variabel. Keren. +1. Terima kasih atas idenya!
Mike S
1

Ini tampaknya kuat dan akan memberikannya kepada Anda dalam format UTC dan ISO8601. (Hapus dua opsi terakhir untuk menonaktifkan keduanya, masing-masing):

date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u -Iseconds
JJC
sumber
0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(Belum cara lain untuk melakukan ini, yang berguna dalam keadaan tertentu)

AmanicA
sumber
0

Perintah:

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

Keluaran:

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

Jelas dan singkat dengan perintah 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
sumber