Weil mein UMPC den Ruhezustand/Ruhezustand schlecht handhabt, musste ich ein Skript für das Herunterfahren nach einer zeitgesteuerten Leerlaufzeit erstellen.
Das Hauptskript:
#!/bin/bash
idletime=$((15*60*1000)) # 15 min in milliseconds
#idletime=$((5*20*330)) # about one minute, for testing
idle=0
while [ $idle -lt $idletime ];do
idle=`xprintidle`
sleep 1
done
/home/jake/Scripts_Icons/Word_Shutdown
sleep 2
sudo shutdown -P now
Das Word_Shutdown
Skript:
#!/bin/bash
if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
wmctrl -a "Microsoft Word"
sleep .2
xdotool keydown 0xffea + key 4
sleep .2
xdotool keyup 0xffea
sleep .2
xdotool key y
fi
Es funktioniert, aber um die Akkulaufzeit richtig zu überwachen, möchte ich, dass meine Betriebszeiten während der Sitzungen mit einer Akkuladung zu einer Betriebszeit zusammengefasst werden.
Ist das möglich? Ich sehe, dass tuptime
die Betriebszeit der vorherigen Sitzung angezeigt wird und die Betriebszeit der aktuellen Sitzung überwacht wird. Gibt es eine Möglichkeit, diese Ausgaben beispielsweise zu einer einzigen Anzeige zu kombinieren 3hr 4 min
?
Die tuptime
Befehlsausgabe:
[jake@P3 ~]$ sudo tuptime -S 2
System startups: 8 since 06:14:53 PM 06/20/2022
System shutdowns: 0 ok + 7 bad
System life: 17h 50m 4s
System uptime: 16.15% = 2h 52m 46s
System downtime: 83.85% = 14h 57m 18s
Average uptime: 21m 36s
Average downtime: 2h 8m 11s
Current uptime: 2h 9m 1s since 09:55:56 AM 06/21/2022
Die „Systembetriebszeit“ fasst offenbar alle Betriebszeiten zwischen den Abschaltungen zusammen.
Ich habe versucht:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Es funktioniert, druckt aber auch die Sekunden und das führende Leerzeichen, d. h 2h 52m 46s
. Gibt es eine Möglichkeit, die Sekunden und das führende Leerzeichen abzuschneiden, sodass nur die Stunden und Minuten übrig bleiben, d. h 2h 52m
.?
Oder uptime
besitzt es selbst einen Griff, an dem man ebenso wackeln kann?
Antwort1
Es funktioniert, aberum die Akkulaufzeit richtig zu überwachen, möchte ich, dass meine Betriebszeiten während der Sitzungen mit einer Akkuladung zu einer Betriebszeit zusammengefasst werden.
Um die Akkulaufzeit richtig zu überwachen:
Identifizieren Sie die Gerätereferenz (den Namen) Ihrer Batterie folgendermaßen
upower -e
:upower -e | grep -i "batt"
Erhalten Sie Batterieinformationen, indem Sie
upower -i
die Referenz (den Namen) Ihrer Batterie wie folgt verwenden:upower -i /org/freedesktop/UPower/devices/battery_BAT0
Verfeinern Sie die
upower -i
Ausgabe, um nurZustandetwa so:awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Verfeinern Sie die
upower -i
Ausgabe, um nurProzentsatzohne "%" etwa so:awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Verwenden Sie das oben genannte Wissen in einem Skript, das alle fünf Minuten prüft, ob Ihr Shutdown-Befehl ausgeführt wird (ersetzen Sie ihn
# Your shutdown command here
durch Ihren tatsächlichen Befehl), wenn Ihre Batterieladungerreicht 8 % oder wenigerwährend es imEntladezustandetwa so:
#!/bin/bash
while true; do
state="$(awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0))"
percentage="$(awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0))"
[ "$state" == "discharging" ] && [ "$percentage" -le "8" ] && # Your shutdown command here
sleep 300
done
Da mein UMPC den Ruhezustand/Ruhezustand schlecht handhabt, musste ich ein Skript für das Herunterfahren nach einer zeitgesteuerten Leerlaufzeit erstellen.
Das Hauptskript:
#!/bin/bash ...
Ihr Hauptskript verwendet Backticks „...“ zur Befehlsersetzung:
idle=`xprintidle`
Obwohl es immer noch funktioniert, gelten Backticks zur Befehlsersetzung als veraltete Funktion (alt und könnte in Zukunft veraltet sein) in Bash, daher empfehle ich
$(...)
stattdessen die Verwendung wie folgt:idle=$(xprintidle)
Der
sleep 1
Anruf ist für eine so unkritische Aufgabe zu kurz. Ich empfehle daher, ihn etwa auf30
Sekunden oder sogar eine Minute zu verlängern, und zwar wie folgt:sleep 1m
Das
Word_Shutdown
Skript:
#!/bin/bash ...
Ihr
Word_Shutdown
Skript weist in diesem Teil zwei Probleme auf:if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
Erstens müssen Sie nicht
grep "Microsoft Word" 2>&1 | wc -l
… verwendengrep -c "Microsoft Word" 2>&1
, es wird das gleiche Ergebnis ausgegeben.Zweitens: Zitieren Sie die Befehlsersetzung direkt im
if
Auswertungsteil, um eine mögliche Worttrennung zu verhindern, wie folgt:if test "$(wmctrl -l | grep -c "Microsoft Word" 2>&1)" -eq 1; then
Ich habe versucht:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Es funktioniert, druckt aber auch die Sekunden und das führende Leerzeichen, d. h
2h 52m 46s
. Gibt es eine Möglichkeit, die Sekunden und das führende Leerzeichen abzuschneiden, sodass nur die Stunden und Minuten übrig bleiben, d. h2h 52m
.?
Ja, und noch besser und zukunftssicher (z. B. wenn System uptime
mehr als 3 Felder enthalten sind 4d 22h 31m 54s
) wie folgt:
tuptime | awk '/System uptime:/ {for (i=1; i < NF; i++) {if (i > 4) {if (i < (NF - 1)) printf("%s ", $i); else print $i}}}'
Die „Systembetriebszeit“ fasst offenbar alle Betriebszeiten zwischen den Abschaltungen zusammen.
Das ist richtig.
Oder verfügt Uptime selbst über einen Hebel, der auf ähnliche Weise gerüttelt werden kann?
Vielleicht -s
ist diese Option für Sie nützlich ... vonMann Tuptime:
-S| --seconds Ausgabezeit in Sekunden und Epoche
Antwort2
Tuptime könnte den Bereich in seinen Berichten einschränken. Da Sie den aktuellen und nur den vorherigen benötigen, verwenden Sie tuptime -S -1
und überprüfen Sie, ob dies mit der Tabellenausgabe richtig ist -t
.
Und um beide Betriebszeiten zusammen zu berechnen:
tuptime -S -1 --csv | grep 'System uptime' | cut -d\" -f6 | awk -F\m '{print $1"m"}'
Verwenden Sie die Tuptime-CSV-Ausgabe, um es einfach zu analysieren, die Zielzeile abzugleichen, das Feld auszuschneiden und den Text vor „m“ zu extrahieren.