因为我的 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`
虽然它仍然可以工作,但命令替换的反引号被视为遗留功能(旧版本,将来可能会被弃用) 因此我建议改用
$(...)
如下方式: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
选项在你的情况下会变得方便...来自人事调动:
-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”之前的文本。