Ich habe ein universelles Shell-Skript für Systeme erstellt, die uptime -p
unterstützen wie neueres Linux und für diejenigen, die dies nicht tun, wie 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"
Kern
Referenzierte John1024-Antwort mit meinen eigenen Anpassungen.
Mein uptime
erzeugt eine Ausgabe, die wie folgt aussieht:
$ uptime
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52
So konvertieren Sie das in Ihr Format:
$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.
Wie es funktioniert
-
-F'( |,|:)+'
awk teilt seine Eingabe in Felder auf. Dies weist awk an, eine beliebige Kombination aus Leerzeichen, Komma oder Doppelpunkt als Feldtrennzeichen zu verwenden.
-
print $6,$7",",$8,"hours,",$9,"minutes."
Dies weist awk an, das sechste Feld und das siebte Feld (getrennt durch ein Leerzeichen) gefolgt von einem Komma, das achte Feld, die Zeichenfolge
hours,
auszugeben das neunte Feld und zuletzt die Zeichenfolgeminutes.
.
Handhabung von Computern mit kurzen Betriebszeiten mit sed
Ab einem Neustart ist mein uptime
erzeugt eine Ausgabe wie:
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
Das folgende sed
Befehl verarbeitet diese Formate:
uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
Mit den oben genannten Zeiten ergibt dies:
1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day, 1 hours, 0 minutes
25 days, 21 hours, 30 minutes
Wie es funktioniert
-
-E
aktiviert die erweiterte reguläre Ausdruckssyntax. (Verwenden Sie auf älteren GNU-Seds-r
anstelle von-E
) -
s/^[^,]*up *//
Dieser Ersetzungsbefehl entfernt den gesamten Text bis
up
. -
s/, *[[:digit:]]* users.*//
Dieser Ersatzbefehl entfernt die Benutzerzählung und den gesamten darauffolgenden Text.
-
s/min/minutes/
Dies ersetzt
min
mitminutes
. -
s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'
Enthält die Zeile eine Uhrzeit im Format hh:mm, trennt diese die Stunden von den Minuten und ersetzt sie durch
hh hours, mm minutes
.
Handhabung von Computern mit kurzen Betriebszeiten mit 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."}'
Bei denselben Testfällen wie oben ergibt dies:
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.
Für diejenigen, die awk-Code bevorzugen, der über mehrere Zeilen verteilt ist:
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."
}'
Lösung :Um die Linux-Betriebszeit in Sekunden zu erhalten, gehen Sie zu bash und geben Sie cat /proc/uptime
ein .Parsen Sie die erste Zahl und konvertieren Sie sie gemäß Ihren Anforderungen.
Aus der RedHat-Dokumentation:
Diese Datei enthält Informationen darüber, wie lange das System seit dem letzten Neustart eingeschaltet war . Die Ausgabe von /proc/uptime
ist ganz minimal:
350735.47 234388.90
Der Erste Zahl ist die Gesamtzahl der Sekunden, die das System in Betrieb war.
Die Zweite Zahl gibt an, wie viel dieser Zeit die Maschine in Sekunden im Leerlauf verbracht hat.
Nur der Vollständigkeit halber... was ist mit:
$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes