我想设置一个每日限制,限制我的计算机一天可以运行多长时间。为此,我正在编写一个 cron 脚本,该脚本将在达到某些里程碑时采取适当的操作(时间用完时显示警报;时间到时关闭计算机)。
我正在努力解决的部分是获得一天的总正常运行时间(以分钟为单位)。我看过这个正常运行时间脚本,但我觉得使用最后的最简单。
$ last -s today
给了我类似的东西:
user tty1 Sat Jul 22 14:09 still logged in
user tty1 Sat Jul 22 11:50 - down (01:56)
我目前正在尝试将括号中的小时转换为分钟,并将“仍然登录”会话转换为分钟。它可以工作,但我觉得所有这些选项都有点复杂。
是否有更简单的方法可以在几分钟内获得总正常运行时间(不包括挂起/睡眠),或者我应该为这些类型的输出找到解决方法?
答案1
在 shell 上执行此命令,以获取uptime
当前会话的总分钟数:
echo "Total uptime today (minutes): $(( ($(date +%s) - $(date -d "$(uptime -s)" +%s)) / 60 ))"
awk
使用和执行此操作/proc/uptime
:
awk '{print "Total uptime for the machine (minutes):", int($1 / 60)}' /proc/uptime
更新:
前两个命令仅显示当前会话的运行时间。
我现在已经在一个小的 bash 脚本中实现了它,结合last
和/proc/uptime.
也许你可以通过 shell 的一行代码来实现它。
#!/bin/bash
sessions_uptime=$(last | grep "$(date '+%b %d')" | grep 'reboot' | grep -v 'still running' | awk '{print $NF}' | tr -d '()' | awk -F: '{sum_minutes+=$1*60+$2} END {print sum_minutes}')
current_time=$(awk '{print int($1 / 60)}' /proc/uptime)
total_uptime=$((sessions_uptime + current_time))
echo "TOTAL CURRENT RUNTIME OF THE DAY: ${total_uptime}"
sessions_uptime
- 过滤掉除 之外
reboots
的所有内容,并计算当天所有会话的时间(以分钟为单位)。last
still running
current_time
- 计算会话的当前运行时间。
total_uptime
- 输出两个值的总和,即当天的总正常运行时间,包括当前会话。我已经在 Debian 11.7 上执行了这个;我不能说它是否适用于所有系统。
更新2:
#!/bin/bash
get_minutes() {
local h=${1%%:*}
local m=${1#*:}
echo $((10#$h * 60 + 10#$m))
}
sessions_uptime=$(last | grep "$(date '+%b %d')" | grep -E 'reboot|suspended' | grep -v 'still running' | awk '{print $NF}' | tr -d '()' | awk -F: '{sum_minutes+=$1*60+$2} END {print sum_minutes}')
current_uptime_seconds=$(awk '{print int($1)}' /proc/uptime)
total_uptime=$((sessions_uptime + current_uptime_seconds / 60))
echo "TOTAL CURRENT RUNTIME OF THE DAY: ${total_uptime} minutes"
确定需要考虑哪些可能发生的情况,并在方法合适的情况下调整脚本。
我在互联网上找到了这些状态消息last
,但我无法确认它们是否全部准确。
”重启”
系统已正常重启
“关闭”
系统已正常关闭
“暂停”
系统已进入挂起或休眠模式
“恢复”
系统已从挂起或休眠模式恢复
“碰撞”
系统因错误或崩溃而重新启动
“向下”
系统已关闭,也可能由于电源故障或硬件问题而发生
“消失了 - 没有注销”
当用户没有正确注销而突然终止连接时可以显示