Obtenir la date et l'heure du démarrage du système sous Linux

44

Je sais que uptimel’imprimante affiche le temps où une machine est en marche, mais existe-t-il un moyen plus simple (fiable) d’obtenir la date de démarrage que de compter à rebours depuis cette sortie?

J'ai essayé de regarder autour de moi /proc, mais je n'ai rien trouvé de pertinent. Il y a aussi une ligne comme celle-ci sur mon dmesg:

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

Mais je me demande si cette méthode est agnostique pour la distribution et la version du noyau?

jho
la source
Qu'est - ce à unreliable or hardpropos uptime?
Bobby
2
@Bobby: Rien sur la commande ou sa fonction en tant que telle, mais comme je l'ai dit, je souhaite obtenir la date et l'heure du dernier démarrage du système, et non le temps écoulé depuis. uptimeretourne une chaîne du type "up 13 days, 21:01", et vous devrez le compter à partir de cela.
jho
4
Il est facile de compter à partir de la valeur de disponibilité. Si vous voulez fiable , vous voulez /proc/uptime.
Sam Hocevar

Réponses:

38

J'ai trouvé des commandes ici . Essayez who -bou last reboot | head -1.
whodonne des dates numériques, tandis que last rebootretourne les noms abrégés de jours / mois.

Le pont Charles
la source
que diriez-vous si nous voulons seulement la date et rien d'autre?
T0xicCode
4
who -b | cut -d' ' -f13date de retour seulement (-f14 heure de retour)
charlesbridge
2
Attention: last rebootne m'a pas donné la date correcte! who -bfait.
Qwertzguy
last rebootm'a donné une date incorrecte aussi, wtmp semblait avoir été tourné le premier jour du mois
Golimar
23

Cela interroge le temps de disponibilité du noyau et l'affiche dans le fuseau horaire local:

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

Faites attention aux autres options. La lastcommande cessera de fonctionner dès que la wtmprotation aura été effectuée. La whocommande dépend de la disponibilité et de l'intégrité de utmp. Et /proc/1pourrait avoir la date actuelle au lieu de la date de démarrage, et pourrait même ne pas être disponible sur un système renforcé. Edit : dmesgne dispose que d’une mémoire tampon de longueur fixe, elle est donc également irréalisable. Les journaux du noyau peuvent être /var/logmais la plupart des distributions n'en conservent que 8 semaines.

sam hocevar
la source
1
Fait intéressant, cela ne correspond pas à who -bune minute ou deux de mon système de 210 jours de disponibilité. On dirait que des who -brapports indiquent un horodatage, alors que ce comptage est en quelque sorte affecté par des dérives d'horloge, même si celles-ci sont périodiquement corrigées par une exécution ntpd.
Ruslan
3
Après avoir examiné toutes les réponses alternatives, décidez-vous sur: date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u(qui a l'heure / la date en UTC)
david6
Réponse phénoménale. Si le noyau ne le sait pas, personne ne le sait, c'est la source de vérité pour le système. Les secondes facilitent les calculs de temps (je suis tombé sur ça parce que je voulais savoir "Lequel de mes hôtes n'a pas redémarré dans le dernier jour [86 400 secondes]?")
Mike S
16

Je suis tombé sur cette question en cherchant un moyen d'obtenir un temps de démarrage cohérent et analysable , par opposition au temps depuis le démarrage qui change à chaque appel.

Il semble que uptime -scela fera l'affaire sur la plupart des systèmes Linux.

mikegreiling
la source
uptime -ssorties par exemple 2017-08-09 01:23:45. C'est le mieux, en étant le plus simple. Cette commande est incluse dans le package "procps".
Teika kazura
Le uptimedans CentOS 6 ( procps version 3.2.8) ne semble malheureusement pas supporter cela.
mwfearnley
uptime -sne renvoie pas toujours des résultats constants: superuser.com/q/1247713/71144
lundi
1
Notez que c'est toujours en heure locale , mais cela n'imprime pas réellement le fuseau horaire / décalage. Donc, si vous cherchez à extraire cela des machines par programmation, ce n'est pas idéal, car vous devrez peut-être déterminer séparément leur fuseau horaire, en fonction de votre cas d'utilisation. Donc, je suggérerais certaines des autres réponses.
JJC
11

J'ai trouvé la btimeligne en /proc/statfouillant un peu

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

et après une recherche rapide, j'ai trouvé cette page: / proc / stat expliqué , qui décrit "diverses informations sur l'activité du noyau disponibles dans le /proc/statfichier".

La ligne "btime" donne l'heure à laquelle le système a démarré, en secondes depuis l'époque Unix.

Oddstr13
la source
1
Il semble beaucoup plus facile d'écrireawk '/btime/{print $2}' /proc/stat
William Pursell Le
@ WilliamPursell plus facile est toujours ce que vous savez déjà. Je ne suis pas un sorcier. : P
Oddstr13
Bon point. Cependant, vous avez utilisé chat gratuitement. Juste grep du fichier.
Mike S
@MikeS correct - cependant, je reste fidèle à ma chaîne de commande d'origine en tant que représentation claire de l'endroit où se trouvent les informations, même 7 ans après ma réponse.
Oddstr13
8
  • bon : uptime -s, who -bou l' analyse syntaxique/proc/uptime
  • mauvais : ls -ld /proc/1et variantes.

N'utilisez pas ls -ld / proc / 1 à cette fin. Il est parfois mis à jour après s2disk ou s2ram.

Dans mon cas, a who -bdéclaré:

démarrage du système 2 mai 09:51

Alors que ls -ld /proc/1:

dr-xr-xr-x 7 racine racine 0 3 mai 13:09 / proc / 1

ls -ldpour /procou /syssemblent persister après la reprise, mais cela dépend de la mise en œuvre et peut changer à l'avenir, alors n'utilisez pas de telles méthodes. Et si votre horloge système est en heure locale, et non en UTC , leur décalage est négatif.

(Je n'ai pas encore le privilège de commenter les réponses, alors j'ai ouvert une nouvelle réponse. Désolé.)

EDIT: a uptime -sété répondu pour la première fois dans cette réponse par mikegreiling

teika kazura
la source
2

Le moyen le plus simple est de regarder quand / sbin / init a démarré (c'est toujours le premier processus à démarrer après le chargement du noyau):

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

Je peux donc voir que ma machine a démarré à minuit le 27 mars 2011 à 6 heures.

Si vous voulez l'utiliser dans un script, vous pouvez utiliser la statcommande à la place:

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

Le %Yspécifie le temps écoulé depuis la dernière modification du répertoire (heure de création du processus) en secondes depuis l’époque (1/1/70) et correspond à un horodatage Unix standard.

Majenko
la source
1
Malheureusement, cela ne fonctionne pas: le mtime de ces dossiers peut changer pour d'autres raisons (j'ai un système ici qui a une disponibilité de 5 jours et le mtime de / proc / 1 il y a 25 minutes)
kdt
1
Ce n'est pas fiable , comme expliqué dans ma réponse
teika kazura
1

Sous Linux,

ls -ld /proc

semble me donner ce dont j'ai besoin. Le post ci-dessus est étrange. /proc/uptimene contient pas de valeur de date - il faudrait la soustraire de l'heure actuelle. Peut-être qu'il voulait dire:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))
gerry
la source
uptime -sfournit une valeur de date
mikegreiling
1

Sous Bash, sans tuyaux ni autres processus; juste du texte:

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

(Vous REPLYvenez de réutiliser la variable par défaut, mais vous pouvez choisir ce dont vous avez besoin)

Luchostein
la source
Bien sûr, pourquoi pas? Utilisation un peu intelligente de la sous-chaîne variable. Cool. +1 Merci pour l'idée!
Mike S
1

Cela semble robuste et vous le donnera aux formats UTC et ISO8601. (Supprimez les deux dernières options pour désactiver l'une ou l'autre):

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

(encore une autre façon de le faire, ce qui est utile dans certaines circonstances)

AmanicA
la source
0

Commander:

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

Sortie:

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

Clair et concis avec la commande 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
la source