You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让WSL中的cron任务仅在笔记本电脑活跃时运行?

在WSL(Debian)中根据Windows电源状态控制同步脚本运行

要解决Modern Standby模式下cron任务仍频繁运行的问题,你可以直接在WSL脚本中调用Windows的系统工具判断电源状态,仅在电脑活跃时执行rsync同步。以下是具体实现方案:

核心思路

WSL允许通过cmd.exe /c前缀直接调用Windows原生命令,因此可以借助query user、powercfg等工具获取系统活跃状态,在脚本中加入前置判断逻辑。

具体脚本修改

修改你的rsync同步脚本,添加电源状态检查步骤:

#!/bin/bash

# 日志文件路径,可按需调整
LOG_FILE="/var/log/rsync_sync.log"

# 检查Windows是否存在活跃用户会话(判断系统是否处于活跃状态)
ACTIVE_SESSION=$(cmd.exe /c "query user | findstr /i active")

if [ -n "$ACTIVE_SESSION" ]; then
    # 系统处于活跃状态,执行rsync同步
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始同步文件..." >> "$LOG_FILE"
    rsync -avz /path/to/local/source/ your-server-user@your-server-ip:/path/to/remote/destination/
    # 记录同步结果
    if [ $? -eq 0 ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 文件同步成功" >> "$LOG_FILE"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 文件同步失败" >> "$LOG_FILE"
    fi
else
    # 系统处于空闲/Modern Standby状态,跳过同步
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 系统处于非活跃状态,跳过同步任务" >> "$LOG_FILE"
fi

可选的电源状态检查方式

如果你更倾向于用powercfg直接获取电源状态,可替换判断逻辑:

# 检查当前系统电源状态是否为活跃
POWER_ACTIVE=$(cmd.exe /c "powercfg /getcurrentpowerstate | findstr /i \"Active\"")

if [ -n "$POWER_ACTIVE" ]; then
    # 执行同步逻辑
fi

注意事项

  • 普通WSL用户权限即可调用Windows命令,无需额外配置。
  • 日志文件需提前创建并设置权限:sudo touch /var/log/rsync_sync.log && sudo chown $USER:$USER /var/log/rsync_sync.log。
  • 若query user输出格式特殊,可调整findstr匹配规则,比如findstr /r "Active"。
  • Modern Standby模式下系统短暂唤醒执行维护任务时,用户会话仍处于非活跃状态,脚本会自动跳过同步,避免资源浪费。

内容的提问来源于stack exchange,提问作者NoExpert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:39:34