shell - 检测计算机进入睡眠状态的平台无关方法?
问题描述
很简单,我有一个 shell 脚本,其中包含一些我在后台运行的长时间运行的操作,然后循环等待(这样我就可以检查它们是否花费了太长时间,报告进度等)。
但是,我还想检查的一种情况是系统何时手动进入睡眠状态(我已经采取措施确保它在我的脚本运行时不应该自动睡眠)。
目前我以一种相当可怕的方式执行此操作,即我的脚本sleep
一次循环运行几秒钟,每次检查任务是否仍在运行。为了检测睡眠,我检查经过的时间是否比预期的长,如下所示:
start=$(date +%s)
while sleep 5; do
if [ $(($(date +%s) - $start)) -gt 6 ]; then
echo 'System may have been asleep'
start=$(date +%s)
elif kill -0 $PID; then
echo 'Task is still running'
start=$(date +%s)
else
echo 'Task is complete'
break
fi
done
以上内容非常简化,如有错误请见谅,只是给出基本思路;例如,在wait
命令支持超时的平台上,我已经使用它来代替sleep
.
现在,虽然这大部分都有效,但它并不是特别漂亮,它并没有真正检测到睡眠,而是猜测系统是否可能已经睡了;例如,它无法区分系统挂起时间足以混淆检查的情况,延长检查时间会对此有所帮助,但这仍然是猜测。
pmset -g uuid
在 macOS 上,如果系统进入睡眠状态,我可以更可靠地检查睡眠,使用它返回一个新的 UUID。我想知道的是,有没有其他平台的替代品?
本质上,我需要的只是一种方法来确定自上次检查以来系统是否一直处于睡眠状态,但如果有一种方法可以接收信号等,那可能会更好。
虽然我希望听到各种平台上可用的最佳选项,但我也非常需要一个与 shell 无关的选项,我可以将其用作可靠的后备,因为我仍然希望 shell 脚本尽可能便携。
解决方案
推荐阅读
- android - Understanding the parts of a kotlin function
- django - 如何使用文件路径从 django 视图上传文件
- python - CSV 文件不存在(Ubuntu 子系统)
- angular - 离子移动应用程序中的全局回调函数
- c++ - 模板 ID 不匹配任何模板声明 GNU gcc 编译器
- html - 使用 v-for 上的循环值来设置条件类
- regex - 有没有办法使用 XPath 解析这个 HTML 代码中的值?
- protocol-buffers - 从 bazel 中的 http_archive 获取 proto 源
- mysql - 在 MySQL 中对不同值执行 GROUP BY 时如何根据 MAX 值选择列
- python-3.x - 如何从numpy数组中删除元素对?