平台不可知的手段来检测计算机是否进入睡眠状态?

时间:2019-09-01 11:01:37

标签: shell sh

很简单,我有一个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

现在,尽管这通常可以正常工作,但它并不是特别漂亮,也不能真正检测到睡眠,而是猜测系统可能是否已休眠;例如,它无法区分系统挂起的时间足以混淆检查的情况,延长检查时间将对此有所帮助,但这仍然是猜测。

在macOS上,我可以使用pmset -g uuid来更可靠地检查睡眠,如果系统进入睡眠状态,它会返回新的UUID。我想知道的是,其他平台是否还有其他选择?

本质上,我所需要的只是一种方法,以找出自上次检查以来系统是否一直处于睡眠状态,尽管如果有一种方法可以接收信号或类似信号,那可能会更好。

尽管我希望听到各种平台上的最佳选项,但我也非常需要一个与外壳无关的选项,并且我可以将其用作可靠的后备选项,因为我仍然希望Shell脚本具有可移植性尽可能。

0 个答案:

没有答案