Debido a que mi umpc maneja mal la suspensión/hibernación, tuve que programar un apagado después de un tiempo de inactividad.
El guión principal:
#!/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
La Word_Shutdown
secuencia de comandos:
#!/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
Funciona, pero para controlar correctamente la duración de la batería, me gustaría que mis tiempos de actividad durante las sesiones con una carga de batería se combinen en un solo tiempo de actividad.
¿Es eso posible? Veo que tuptime
mostrará el tiempo de actividad de la sesión anterior y comenzará a monitorear el tiempo de actividad de la sesión actual. ¿Hay alguna manera de combinar estas salidas en una sola lectura, por ejemplo 3hr 4 min
?
La tuptime
salida del comando:
[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
El "tiempo de actividad del sistema" aparentemente combina todos los tiempos de actividad entre apagados.
Yo he tratado:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Funciona pero también imprime los segundos y el espacio inicial, es decir 2h 52m 46s
. ¿Hay alguna manera de cortar los segundos y el espacio en blanco inicial, dejando solo las horas y los minutos, es decir 2h 52m
?
¿O uptime
tiene un mango que se puede mover de manera similar?
Respuesta1
Funciona, peropara controlar correctamente la duración de la batería, Me gustaría que mis tiempos de actividad durante las sesiones con una carga de batería se combinaran en un solo tiempo de actividad.
Para controlar correctamente la duración de la batería:
Identifique la referencia (nombre) del dispositivo de su batería de la
upower -e
siguiente manera:upower -e | grep -i "batt"
Obtenga información de la batería usando
upower -i
la referencia (nombre) de su batería de esta manera:upower -i /org/freedesktop/UPower/devices/battery_BAT0
Refina la
upower -i
salida para obtener soloestadoal igual que:awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Refina la
upower -i
salida para obtener soloporcentajesin "%" así:awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Utilice el conocimiento anterior en un script que verifique cada cinco minutos para ejecutar su comando de apagado (reemplácelo
# Your shutdown command here
con su comando real) cuando se cargue la batería.alcanza el 8% o menosmientras está en elestado de descargaal igual que:
#!/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
Debido a que mi umpc maneja mal la suspensión/hibernación, tuve que programar un apagado después de un tiempo de inactividad.
El guión principal:
#!/bin/bash ...
Su script principal usa marcas invertidas `...` para la sustitución de comandos:
idle=`xprintidle`
Si bien seguirá funcionando, las marcas invertidas para la sustitución de comandos se consideran una característica heredada (antiguo y podría quedar obsoleto en el futuro) en bash, por lo que recomiendo usarlo
$(...)
así:idle=$(xprintidle)
La
sleep 1
llamada es demasiado corta para una tarea tan poco crítica... así que recomiendo extenderla para que diga30
segundos o incluso un minuto así:sleep 1m
La
Word_Shutdown
secuencia de comandos:
#!/bin/bash ...
Su
Word_Shutdown
script tiene dos problemas en esta parte:if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
Primero, no es necesario utilizar
grep "Microsoft Word" 2>&1 | wc -l
...grep -c "Microsoft Word" 2>&1
generará el mismo resultado.En segundo lugar, cite la sustitución de comandos utilizada directamente en la
if
parte de evaluación para evitar una posible división de palabras de esta manera:if test "$(wmctrl -l | grep -c "Microsoft Word" 2>&1)" -eq 1; then
Yo he tratado:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Funciona pero también imprime los segundos y el espacio inicial, es decir
2h 52m 46s
. ¿Hay alguna manera de cortar los segundos y el espacio en blanco inicial, dejando solo las horas y los minutos, es decir2h 52m
?
Sí, e incluso mejor y preparado para el futuro (por ejemplo, si System uptime
contiene más de 3 campos 4d 22h 31m 54s
), así:
tuptime | awk '/System uptime:/ {for (i=1; i < NF; i++) {if (i > 4) {if (i < (NF - 1)) printf("%s ", $i); else print $i}}}'
El "tiempo de actividad del sistema" aparentemente combina todos los tiempos de actividad entre apagados.
Eso es correcto.
¿O el tiempo de actividad en sí tiene un control que puede moverse de manera similar?
Quizás la -s
opción te resulte útil en tu caso... desdehombre tuptime:
-s| --segundos Tiempo de salida en segundos y época
Respuesta2
Tuptime podría reducir el alcance de sus informes. Como necesita el actual y solo el anterior, use tuptime -S -1
, verifique que esté correcto con la salida de la tabla -t
.
Y para calcular ambos tiempos de actividad juntos:
tuptime -S -1 --csv | grep 'System uptime' | cut -d\" -f6 | awk -F\m '{print $1"m"}'
Utilice la salida csv de Tuptime para analizarlo fácilmente, hacer coincidir la línea de destino, cortar el campo y extraer el texto antes de 'm'.