J'ai créé un script shell universel, pour les systèmes prenant en charge uptime -p
comme Linux plus récent et pour ceux qui ne le font pas, comme Mac OS X.
#!/bin/sh
uptime -p >/dev/null 2>&1
if [ "$?" -eq 0 ]; then
# Supports most Linux distro
# when the machine is up for less than '0' minutes then
# 'uptime -p' returns ONLY 'up', so we need to set a default value
UP_SET_OR_EMPTY=$(uptime -p | awk -F 'up ' '{print $2}')
UP=${UP_SET_OR_EMPTY:-'less than a minute'}
else
# Supports Mac OS X, Debian 7, etc
UP=$(uptime | sed -E 's/^[^,]*up *//; s/mins/minutes/; s/hrs?/hours/;
s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/;
s/^1 hours/1 hour/; s/ 1 hours/ 1 hour/;
s/min,/minutes,/; s/ 0 minutes,/ less than a minute,/; s/ 1 minutes/ 1 minute/;
s/ / /; s/, *[[:digit:]]* users?.*//')
fi
echo "up $UP"
L'essentiel
Réponse John1024 référencée avec mes propres personnalisations.
Mon uptime
produit une sortie qui ressemble à :
$ uptime
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52
Pour convertir cela dans votre format :
$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.
Comment ça marche
-
-F'( |,|:)+'
awk divise son entrée en champs. Cela indique à awk d'utiliser n'importe quelle combinaison d'un ou plusieurs espaces, virgules ou deux-points comme séparateur de champ.
-
print $6,$7",",$8,"hours,",$9,"minutes."
Cela indique à awk d'imprimer le sixième champ et le septième champs (séparés par un espace) suivis d'une virgule, le 8ème champ, la chaîne
hours,
le neuvième champ, et enfin la chaîneminutes.
.
Gestion des ordinateurs avec des temps de fonctionnement courts à l'aide de sed
A partir d'un redémarrage, mon uptime
produit une sortie comme :
03:14:20 up 1 min, 2 users, load average: 2.28, 1.29, 0.50
04:12:29 up 59 min, 5 users, load average: 0.06, 0.08, 0.48
05:14:09 up 2:01, 5 users, load average: 0.13, 0.10, 0.45
03:13:19 up 1 day, 0 min, 8 users, load average: 0.01, 0.04, 0.05
04:13:19 up 1 day, 1:00, 8 users, load average: 0.02, 0.05, 0.21
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52
Le sed
suivant La commande gère ces formats :
uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
Avec les temps ci-dessus, cela produit :
1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day, 1 hours, 0 minutes
25 days, 21 hours, 30 minutes
Comment ça marche
-
-E
active la syntaxe des expressions régulières étendues. (Sur les anciens GNU seds, utilisez-r
à la place de-E
) -
s/^[^,]*up *//
Cette commande de remplacement supprime tout le texte jusqu'à
up
. -
s/, *[[:digit:]]* users.*//
Cette commande de substitution supprime le nombre d'utilisateurs et tout le texte qui le suit.
-
s/min/minutes/
Ceci remplace
min
avecminutes
. -
s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
Si la ligne contient une heure au format hh:mm, celle-ci sépare les heures des minutes et la remplace par
hh hours, mm minutes
.
Gérer les ordinateurs avec des temps de fonctionnement courts à l'aide d'awk
uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
Sur les mêmes cas de test que ci-dessus, cela produit :
0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.
Pour ceux qui préfèrent le code awk réparti sur plusieurs lignes :
uptime | awk -F'( |,|:)+' '{
d=h=m=0;
if ($7=="min")
m=$6;
else {
if ($7~/^day/) { d=$6; h=$8; m=$9}
else {h=$6;m=$7}
}
}
{
print d+0,"days,",h+0,"hours,",m+0,"minutes."
}'
Solution :Afin d'obtenir la disponibilité de Linux en quelques secondes, allez dans bash et tapez cat /proc/uptime
.Analysez le premier nombre et convertissez-le selon vos besoins.
À partir de la documentation RedHat :
Ce fichier contient des informations détaillant la durée d'activation du système depuis son dernier redémarrage . La sortie de
/proc/uptime
est assez minime :350735.47 234388.90
Le Premier nombre est le nombre total de secondes pendant lesquelles le système a fonctionné.
Le deuxième nombre correspond à la durée d'inactivité de la machine, en secondes.
Juste pour être complet... de quoi s'agit-il :
$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes