首页 > 解决方案 > 检测计算机进入睡眠状态的平台无关方法?

问题描述

很简单,我有一个 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 脚本尽可能便携。

标签: shellsh

解决方案


推荐阅读