Como meu umpc lida mal com a suspensão/hibernação, tive que criar um script de desligamento após o tempo de inatividade.
O roteiro 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
O Word_Shutdown
roteiro:
#!/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, mas para monitorar adequadamente a vida útil da bateria, gostaria que meus tempos de atividade durante as sessões com uma carga de bateria fossem combinados em um tempo de atividade.
Isso é possível? Vejo que tuptime
mostrará o tempo de atividade da sessão anterior e começará a monitorar o tempo de atividade da sessão atual. Existe uma maneira de combinar essas saídas em uma única leitura, por exemplo 3hr 4 min
?
A tuptime
saída do 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
O "tempo de atividade do sistema" aparentemente combina todos os tempos de atividade entre os desligamentos.
Eu tentei:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Funciona, mas imprime os segundos e o espaço inicial também, ou seja 2h 52m 46s
, . Existe uma maneira de cortar os segundos e o espaço em branco inicial, deixando apenas as horas e os minutos, ou seja 2h 52m
?
Ou uptime
ele próprio tem uma alça que pode ser balançada de forma semelhante?
Responder1
Funciona, maspara monitorar a vida útil da bateria corretamente, gostaria que meus tempos de atividade durante as sessões com uma carga de bateria fossem combinados em um tempo de atividade.
Para monitorar adequadamente a vida útil da bateria:
Identifique a referência (nome) do dispositivo da sua bateria da
upower -e
seguinte forma:upower -e | grep -i "batt"
Obtenha informações da bateria usando
upower -i
a referência (nome) da sua bateria da seguinte forma:upower -i /org/freedesktop/UPower/devices/battery_BAT0
Refine a
upower -i
saída para obter apenasestadoigual a:awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Refine a
upower -i
saída para obter apenaspercentagemsem "%" assim:awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Use o conhecimento acima em um script que verifica a cada cinco minutos para executar o comando de desligamento (substitua
# Your shutdown command here
pelo comando real) quando a bateria estiver carregadaatinge 8% ou menosenquanto estiver noestado de descargaigual a:
#!/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
Como meu umpc lida mal com a suspensão/hibernação, tive que criar um script de desligamento após o tempo de inatividade.
O roteiro principal:
#!/bin/bash ...
Seu script principal usa back ticks `...` para substituição de comando:
idle=`xprintidle`
Embora ainda funcione, os back ticks para substituição de comando são considerados um recurso legado(antigo e pode ficar obsoleto no futuro) no bash, então recomendo usar
$(...)
assim:idle=$(xprintidle)
A
sleep 1
chamada é muito curta para uma tarefa tão acrítica... então recomendo estendê-la para30
segundos ou até um minuto, assim:sleep 1m
O
Word_Shutdown
roteiro:
#!/bin/bash ...
Seu
Word_Shutdown
script tem dois problemas nesta parte:if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
Primeiro, você não precisa usar
grep "Microsoft Word" 2>&1 | wc -l
...grep -c "Microsoft Word" 2>&1
produzirá o mesmo resultado.Segundo, cite a substituição do comando usada diretamente na
if
parte de avaliação para evitar possível divisão de palavras como esta:if test "$(wmctrl -l | grep -c "Microsoft Word" 2>&1)" -eq 1; then
Eu tentei:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Funciona, mas imprime os segundos e o espaço inicial também, ou seja
2h 52m 46s
, . Existe uma maneira de cortar os segundos e o espaço em branco inicial, deixando apenas as horas e os minutos, ou seja2h 52m
?
Sim, e ainda melhor e à prova de futuro (por exemplo, se System uptime
contiver mais de 3 campos, por exemplo 4d 22h 31m 54s
), assim:
tuptime | awk '/System uptime:/ {for (i=1; i < NF; i++) {if (i > 4) {if (i < (NF - 1)) printf("%s ", $i); else print $i}}}'
O "tempo de atividade do sistema" aparentemente combina todos os tempos de atividade entre os desligamentos.
Está correto.
Ou o próprio tempo de atividade tem uma alça que pode ser movimentada de forma semelhante?
Talvez a -s
opção seja útil no seu caso... decara, hora da hora:
-s| --seconds Tempo de saída em segundos e época
Responder2
A Tuptime poderia restringir o alcance em seus relatórios. Como você precisa do atual e apenas do anterior, use tuptime -S -1
, verifique se está certo com a saída da tabela -t
.
E para calcular os dois tempos de atividade juntos:
tuptime -S -1 --csv | grep 'System uptime' | cut -d\" -f6 | awk -F\m '{print $1"m"}'
Use a saída csv do Tuptime para analisá-lo facilmente, combinar a linha de destino, cortar o campo e extrair o texto antes de 'm'.