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
-
-Eactive 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
minavecminutes. -
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/uptimeest assez minime :350735.47 234388.90Le 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