news 2026/10/28 6:02:16

防止系统休眠的脚本实现与优化技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
防止系统休眠的脚本实现与优化技巧

1. 项目概述

这个脚本的核心功能是通过模拟用户活动来阻止系统进入睡眠状态或关闭显示器。在实际工作中,我们经常会遇到这样的情况:需要让电脑长时间保持运行状态,但又不想手动操作来防止系统休眠。比如下载大文件、渲染视频、运行长时间计算任务时,系统默认的电源管理设置可能会中断这些进程。

我最初开发这个脚本是为了解决远程服务器维护时的实际问题。当通过SSH连接服务器执行长时间任务时,如果本地电脑进入睡眠状态,可能会导致连接中断。后来发现这个需求在各种场景下都很普遍,于是逐步完善成了一个通用工具。

2. 技术原理分析

2.1 系统睡眠机制

现代操作系统都有完善的电源管理机制。以Windows为例,系统会根据以下条件判断是否进入睡眠状态:

  • 用户无操作时间达到预设阈值
  • 系统负载低于特定水平
  • 电池电量状态(笔记本)

Linux系统也有类似的机制,通过ACPI(高级配置与电源接口)与内核交互管理电源状态。

2.2 模拟用户活动的实现方式

脚本主要通过以下几种方式模拟用户活动:

  1. 鼠标移动模拟:在屏幕上微小移动鼠标指针
  2. 键盘输入模拟:发送虚拟按键事件
  3. 系统API调用:直接调用系统API重置空闲计时器
  4. 多媒体播放:启动无声的音视频播放

这些操作都能有效地"欺骗"系统,让它认为用户正在使用电脑,从而阻止睡眠或显示器关闭。

3. 脚本实现方案

3.1 Windows平台实现

对于Windows系统,最可靠的方式是使用PowerShell脚本:

# 阻止系统睡眠的PowerShell脚本 $WShell = New-Object -ComObject "WScript.Shell" while ($true) { # 模拟F15键按下(这是一个很少使用的键,不会影响实际工作) $WShell.SendKeys("{F15}") # 每60秒发送一次 Start-Sleep -Seconds 60 }

这个脚本利用了Windows Script Host的SendKeys方法来模拟键盘输入。选择F15键是因为它几乎不会被任何程序使用,不会干扰正常工作。

3.2 Linux/macOS实现

在Unix-like系统上,可以使用以下bash脚本:

#!/bin/bash # 阻止Linux/macOS系统睡眠的脚本 while true; do # 移动鼠标指针1像素并返回 xdotool mousemove_relative 1 1 xdotool mousemove_relative -- -1 -1 # 等待59秒 sleep 59 done

这个脚本需要安装xdotool工具(可以通过包管理器安装)。它通过微小的鼠标移动来模拟用户活动。

3.3 Python跨平台实现

如果需要跨平台支持,可以使用Python编写:

import time import platform import pyautogui def prevent_sleep(): while True: # 根据系统类型采用不同策略 if platform.system() == "Windows": # Windows下模拟键盘输入 pyautogui.press('volumemute') # 静音键通常不会影响程序 else: # Linux/macOS下微移鼠标 pyautogui.moveRel(1, 1) pyautogui.moveRel(-1, -1) time.sleep(60) if __name__ == "__main__": prevent_sleep()

这个Python脚本使用了pyautogui库,需要先安装(pip install pyautogui)。它根据操作系统自动选择最适合的模拟方式。

4. 高级功能实现

4.1 智能检测系统负载

基础脚本会持续运行,即使系统正在使用中。我们可以改进为只在检测到系统空闲时才激活:

import psutil import time def is_system_active(): # 检测CPU使用率 if psutil.cpu_percent(interval=1) > 10: return True # 检测网络活动 net1 = psutil.net_io_counters() time.sleep(1) net2 = psutil.net_io_counters() if net2.bytes_sent - net1.bytes_sent > 1024 or net2.bytes_recv - net1.bytes_recv > 1024: return True return False def smart_prevent_sleep(): while True: if not is_system_active(): # 只有系统空闲时才模拟活动 pyautogui.press('volumemute') time.sleep(60)

这个改进版会检测CPU使用率和网络活动,只在系统真正空闲时才会干预。

4.2 多显示器支持

对于多显示器配置,需要特殊处理:

def multi_monitor_support(): try: # 获取显示器数量 monitor_count = pyautogui.screenshot().size[0] // pyautogui.size()[0] for _ in range(monitor_count): pyautogui.moveRel(1, 1) pyautogui.moveRel(-1, -1) except: # 回退到单显示器方案 pyautogui.press('volumemute')

4.3 资源占用优化

为了防止脚本本身消耗过多资源,可以添加资源限制:

import resource def set_memory_limit(): # 限制内存使用为50MB resource.setrlimit(resource.RLIMIT_AS, (50 * 1024 * 1024, 50 * 1024 * 1024))

5. 实际应用场景

5.1 长时间下载/上传

当进行大文件传输时,系统休眠会中断网络连接。使用这个脚本可以确保传输完成:

# 启动防睡眠脚本后台运行 nohup ./prevent_sleep.sh & # 开始下载大文件 wget http://example.com/large_file.iso # 下载完成后结束脚本 pkill -f prevent_sleep.sh

5.2 远程服务器维护

通过SSH连接服务器时,本地电脑睡眠会导致连接中断:

# 在本地电脑运行防睡眠脚本 ./prevent_sleep.sh & # 然后启动SSH连接 ssh user@remote-server

5.3 媒体播放和演示

在进行长时间演示或媒体播放时,防止显示器自动关闭:

# 在播放视频前启动 import subprocess player = subprocess.Popen(["vlc", "presentation.mp4"]) prevent_sleep()

6. 常见问题与解决方案

6.1 权限问题

在Linux系统上可能会遇到权限错误:

xdotool: unable to open display ''

解决方案:

  1. 确保脚本在有GUI的环境中运行
  2. 设置正确的DISPLAY环境变量:
    export DISPLAY=:0
  3. 或者使用xvfb创建虚拟显示:
    sudo apt install xvfb Xvfb :1 -screen 0 1024x768x16 & export DISPLAY=:1

6.2 系统策略限制

某些企业环境中,组策略可能禁止模拟输入:

注意:在企业环境中使用前,请确认不违反IT政策

解决方案:

  1. 改用系统API调用方式
  2. 申请例外策略
  3. 使用硬件解决方案(如物理鼠标抖动器)

6.3 脚本退出问题

如何优雅地停止后台运行的脚本:

# 查找脚本进程ID ps aux | grep prevent_sleep # 终止进程 kill [PID]

或者在脚本中添加信号处理:

import signal import sys def signal_handler(sig, frame): print('脚本已停止') sys.exit(0) signal.signal(signal.SIGINT, signal_handler)

7. 性能优化技巧

7.1 最小化资源占用

# 降低脚本优先级 import os os.nice(19) # Linux # 或Windows等效方案 if os.name == 'nt': import win32api, win32process, win32con pid = win32api.GetCurrentProcessId() handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid) win32process.SetPriorityClass(handle, win32process.IDLE_PRIORITY_CLASS)

7.2 自适应间隔调整

根据系统活动动态调整模拟间隔:

last_activity = time.time() def activity_detector(): global last_activity # 检测用户真实活动 if pyautogui.position() != last_pos: last_activity = time.time() last_pos = pyautogui.position() def adaptive_interval(): while True: idle_time = time.time() - last_activity if idle_time > 300: # 5分钟无活动 interval = 30 # 更频繁模拟 elif idle_time > 1800: # 30分钟无活动 interval = 10 else: interval = 60 time.sleep(interval) pyautogui.press('volumemute')

8. 安全注意事项

  1. 不要过度使用:长期阻止系统睡眠可能导致硬件过热或缩短电池寿命
  2. 避免安全风险:确保脚本不会被恶意软件利用来维持系统活动
  3. 权限最小化:脚本只需最基本的用户权限即可运行
  4. 日志记录:建议添加简单的日志功能记录脚本活动:
import logging logging.basicConfig(filename='prevent_sleep.log', level=logging.INFO) def log_activity(): logging.info(f"模拟用户活动于 {time.ctime()}")

9. 替代方案比较

方案优点缺点适用场景
脚本模拟灵活可定制,免费需要运行环境开发者和技术人员
电源设置调整系统原生支持需要管理员权限个人电脑长期配置
专用工具功能全面可能有费用或广告非技术用户
硬件方案完全独立于软件需要额外设备高度安全环境

10. 进阶开发方向

  1. GUI控制界面:添加简单的图形界面控制脚本启停
  2. 远程控制:通过网络接口控制脚本运行
  3. 电量感知:笔记本电池模式下自动调整策略
  4. 多平台打包:将脚本打包为各平台可执行文件

示例打包命令(使用PyInstaller):

pip install pyinstaller pyinstaller --onefile prevent_sleep.py

这个简单的脚本虽然原理不复杂,但在实际应用中却能解决很多实际问题。我在多个项目中都使用过不同版本的实现,根据具体需求调整策略。最重要的是理解你的使用场景,选择最适合的实现方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 6:01:57

Redis Exporter 安装配置与 Prometheus 监控实践

1. Redis Exporter 是什么?Redis Exporter 是一个专门用于将 Redis 监控数据暴露给 Prometheus 的工具。它通过 Redis 的 INFO 命令获取 Redis 实例的运行状态信息,并将其转换为 Prometheus 可识别的 metrics 格式。在实际生产环境中,Redis E…

作者头像 李华
网站建设 2026/10/28 6:01:52

Coze+Banana2批量生成小红书财经手绘图教程

1. 项目概述:用CozeBanana2批量生成小红书爆款手绘图最近在帮一家财经自媒体做内容升级时,发现他们每天最耗时的工作就是制作那种小红书爆款风格的手绘财经知识图。传统做法需要设计师用Procreate一张张画,平均每张图耗时2小时,而…

作者头像 李华
网站建设 2026/10/28 6:01:45

流水线控制冒险:ID级提前判断与冲刷机制详解

简介:这份PDF是电子科技大学2021年计算机体系结构课程的实验四报告,面向正在学习流水线CPU设计、需要攻克控制冒险难题的高校学生与Verilog初学者。报告围绕JUMP无条件跳转及BNE、BEQ条件跳转三类指令展开,讲解如何在ID级提前计算转移地址与i…

作者头像 李华
网站建设 2026/10/28 6:01:33

自研行为式人机验证T3Code:从轨迹采集到风险评分的完整实践

这年头做网站最烦的,不是服务器扛不住,而是半夜打开后台,注册量曲线突然拉成一条直线,用户ID一排排往下刷,邮箱后缀全是同一个服务商。这种场景我碰到过几次之后,决定不再跟第三方验证码SDK来回扯皮&#x…

作者头像 李华
网站建设 2026/10/28 6:00:31

.NET集成BitLocker全磁盘加密技术实践指南

1. BitLocker加密技术概述BitLocker是微软从Windows Vista开始引入的全磁盘加密技术,它通过AES加密算法(通常使用128位或256位密钥)对整个磁盘卷进行加密保护。作为Windows生态的核心安全组件,BitLocker在企业数据保护、设备丢失防…

作者头像 李华
网站建设 2026/10/28 6:00:30

ELMO驱动器+EAS II配置全流程:从接线到整定避坑指南

简介:这份资源是面向运动控制工程师与自动化调试人员的ELMO驱动器EAS II配置入门教程,聚焦硬件接线与软件配置两大环节,帮助初学者解决从接口定义到驱动器连接、电机参数整定的实操问题。资源包内仅含1个docx文档,约4.45MB&#x…

作者头像 李华