Поскольку мой umpc плохо справляется с режимами ожидания/гибернации, мне пришлось написать скрипт выключения после заданного времени простоя.
Основной сценарий:
#!/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
Сценарий Word_Shutdown
:
#!/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
Это работает, но для того, чтобы правильно отслеживать время работы батареи, я бы хотел, чтобы время работы во время сеансов на одном заряде батареи было объединено в одно время работы.
Это возможно? Я вижу, что это tuptime
покажет время безотказной работы предыдущего сеанса и начнет отслеживать время безотказной работы текущего сеанса. Есть ли способ объединить эти выходы в один вывод, например 3hr 4 min
?
Вывод команды tuptime
:
[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
«Время безотказной работы системы», по-видимому, объединяет все время безотказной работы между отключениями.
Я пытался:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Это работает, но печатает секунды и начальный пробел, например 2h 52m 46s
. Есть ли способ вырезать секунды и начальный пробел, оставив только часы и минуты, например 2h 52m
?
Или uptime
у него есть ручка, которую можно так же покачивать?
решение1
Это работает, нодля того, чтобы правильно контролировать срок службы батареиЯ бы хотел, чтобы время моей работы во время сеансов на одном заряде батареи было объединено в одно время работы.
Для правильного контроля срока службы батареи:
Определите наименование устройства вашей батареи следующим
upower -e
образом:upower -e | grep -i "batt"
Получите информацию о батарее, используя
upower -i
ссылку (имя) вашей батареи, например, так:upower -i /org/freedesktop/UPower/devices/battery_BAT0
Уточните
upower -i
вывод, чтобы получить толькосостояниевот так:awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Уточните
upower -i
вывод, чтобы получить толькопроцентбез "%" вот так:awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
Используйте приведенные выше знания в скрипте, который проверяет каждые пять минут, чтобы выполнить команду выключения (замените ее
# Your shutdown command here
на фактическую команду), когда ваш аккумулятор заряжается.достигает 8% или менеепока он находится всостояние разрядкивот так:
#!/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
Поскольку мой umpc плохо справляется с режимами ожидания/гибернации, мне пришлось написать скрипт выключения после заданного времени простоя.
Основной сценарий:
#!/bin/bash ...
Ваш основной скрипт использует обратные кавычки `...` для подстановки команд:
idle=`xprintidle`
Хотя это все еще будет работать, обратные кавычки для подстановки команд считаются устаревшей функцией (устарел и может быть упразднен в будущем) в bash, поэтому я рекомендую использовать
$(...)
вместо этого следующее:idle=$(xprintidle)
Звонок
sleep 1
слишком короток для такой некритической задачи... поэтому я рекомендую продлить его, скажем, на30
секунды или даже на минуту, например:sleep 1m
Сценарий
Word_Shutdown
:
#!/bin/bash ...
Word_Shutdown
В этой части вашего сценария есть две проблемы:if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
Во-первых, вам не нужно использовать
grep "Microsoft Word" 2>&1 | wc -l
... ,grep -c "Microsoft Word" 2>&1
результат будет таким же.Во-вторых, заключите в кавычки подстановку команды, используемую непосредственно в
if
части оценки, чтобы предотвратить возможное разделение слов, например:if test "$(wmctrl -l | grep -c "Microsoft Word" 2>&1)" -eq 1; then
Я пытался:
tuptime | awk -F'=' '/System uptime:/ {print $2}'
Это работает, но печатает секунды и начальный пробел, например
2h 52m 46s
. Есть ли способ вырезать секунды и начальный пробел, оставив только часы и минуты, например2h 52m
?
Да, и даже лучше и на будущее (например, если System uptime
содержит более 3 полей 4d 22h 31m 54s
), например так:
tuptime | awk '/System uptime:/ {for (i=1; i < NF; i++) {if (i > 4) {if (i < (NF - 1)) printf("%s ", $i); else print $i}}}'
«Время безотказной работы системы», по-видимому, объединяет все время безотказной работы между отключениями.
Это верно.
Или у самого времени безотказной работы есть ручка, которую можно регулировать аналогичным образом?
Возможно, -s
в вашем случае эта опция окажется удобной...человек время:
-с| --seconds Вывести время в секундах и эпоху
решение2
Tuptime может сузить диапазон в своих отчетах. Поскольку вам нужен текущий и только предыдущий, используйте tuptime -S -1
, проверьте, что он правильный с табличным выводом -t
.
И чтобы рассчитать оба времени безотказной работы вместе:
tuptime -S -1 --csv | grep 'System uptime' | cut -d\" -f6 | awk -F\m '{print $1"m"}'
Используйте вывод Tuptime csv для его легкого анализа, сопоставьте целевую строку, вырежьте поле и извлеките текст перед «m».