Windows 开机自动启动 Hermes
# 前言
在 Linux 服务器上,我们通常使用 systemd 或 cron 的 @reboot 来实现开机自启。但在 Windows + WSL 环境下,情况稍微复杂一些:
- Windows 重启后,WSL 默认不会自动启动
- 即使 WSL 启动了,内部的 Hermes 也不会自动运行
本文将介绍如何通过 Windows 任务计划程序,实现"Windows 开机 → WSL 自动启动 → Hermes 自动运行"的完整链路。
# 问题分析
# Windows 重启后的现状
默认情况下,Windows 重启后:
- WSL 不启动 - 直到用户第一次打开 WSL 终端,或有程序访问 WSL 网络
- Hermes 不运行 - 即使 WSL 启动了,用户目录下的脚本也不会自动执行
注意
使用 NT AUTHORITY\SYSTEM 账户启动 wsl.exe 时,Windows 只唤醒 Linux 内核,不会自动执行 .bashrc 或其他用户脚本。
# 解决思路
将"启动 WSL"和"启动 Hermes"合并为一条命令,让 Windows 任务计划直接执行:
Windows 开机 → 任务计划触发 → 执行 WSL 命令 → WSL 内部启动 Hermes
# 完整配置步骤
# 第一步:查看 WSL 分发版名称
在 PowerShell 中运行:
wsl -l -v
输出示例:
NAME STATE VERSION
Ubuntu Running 2
Ubuntu-24.04 Stopped 2
2
3
记住你要使用的分发版名称(如 Ubuntu 或 Ubuntu-24.04)。
# 第二步:获取 Hermes 绝对路径
进入 WSL,查找 Hermes 的安装路径:
# 进入 WSL
wsl -d Ubuntu
# 查看 hermes 命令位置
which hermes
# 或查看实际 launcher 路径
ls -la ~/.hermes/hermes-agent/venv/bin/hermes
2
3
4
5
6
7
8
常见路径:
| 安装方式 | 路径 |
|---|---|
| 普通用户 | /home/<用户名>/.hermes/hermes-agent/venv/bin/hermes |
| Root 模式 | /root/.hermes/hermes-agent/venv/bin/hermes |
| 全局安装 | /usr/local/bin/hermes |
警告
必须使用绝对路径,不能使用 ./hermes 或 ~/hermes 这种相对路径!
# 第三步:清理旧任务(如有)
如果之前配置过但没有生效,先删除旧任务:
# PowerShell(管理员)
Unregister-ScheduledTask -TaskName "StartWSLHermes" -Confirm:$false
2
# 第四步:创建开机自启任务
在 PowerShell(管理员)中运行:
# 创建开机自启任务
Register-ScheduledTask -TaskName "StartWSLHermes" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Action (New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu -u root -- nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes > /dev/null 2>&1 &") `
-User "NT AUTHORITY\SYSTEM"
2
3
4
5
6
参数说明:
| 参数 | 说明 |
|---|---|
-TaskName | 任务名称,自定义即可 |
-Trigger -AtStartup | 开机时触发 |
-Execute "wsl.exe" | 执行 WSL |
-Argument | WSL 参数(关键!) |
-User "NT AUTHORITY\SYSTEM" | 使用系统账户运行(无需登录) |
Argument 参数详解:
-d Ubuntu # 指定分发版名称
-u root # 使用 root 用户执行
-- # WSL 参数结束标记
nohup # 后台运行,不随终端关闭而退出
/home/felix/.hermes/.../hermes # Hermes 绝对路径(必须修改!)
> /dev/null 2>&1 & # 重定向输出,完全后台化
2
3
4
5
6
提示
请务必修改:
-d Ubuntu→ 改成你的分发版名称/home/felix/.hermes/...→ 改成你的 Hermes 绝对路径
# 进阶配置
# 启动 Hermes Gateway
如果需要启动 Gateway(而非 CLI):
Register-ScheduledTask -TaskName "StartWSLHermesGateway" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Action (New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu -u root -- nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes gateway > /dev/null 2>&1 &") `
-User "NT AUTHORITY\SYSTEM"
2
3
4
5
# 同时启动多个服务
创建一个启动脚本,一次性启动多个服务:
# 在 WSL 内创建 ~/start-hermes.sh
#!/bin/bash
cd /home/felix
nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes gateway > /tmp/hermes-gateway.log 2>&1 &
nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes desktop > /tmp/hermes-desktop.log 2>&1 &
2
3
4
5
然后任务计划执行脚本:
Register-ScheduledTask -TaskName "StartWSLHermes" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Action (New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu -u root -- bash /home/felix/start-hermes.sh") `
-User "NT AUTHORITY\SYSTEM"
2
3
4
5
# 带环境变量的启动
如果 Hermes 需要特定环境变量:
Register-ScheduledTask -TaskName "StartWSLHermes" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Action (New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu -u root -- export HERMES_HOME=/home/felix/.hermes && nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes gateway > /dev/null 2>&1 &") `
-User "NT AUTHORITY\SYSTEM"
2
3
4
5
# 验证与测试
# 手动测试任务
# 手动触发任务测试
Start-ScheduledTask -TaskName "StartWSLHermes"
# 等待几秒后检查 WSL
wsl -l -v
# 进入 WSL 检查进程
wsl -d Ubuntu
ps aux | grep hermes
2
3
4
5
6
7
8
9
# 查看任务状态
# 查看任务详情
Get-ScheduledTask -TaskName "StartWSLHermes" | Get-ScheduledTaskInfo
# 查看任务历史
Get-ScheduledTask -TaskName "StartWSLHermes" | Select-Object *
2
3
4
5
# 重启验证
# 重启 Windows
Restart-Computer
# 重启后检查
wsl -l -v # WSL 应在运行
wsl -d Ubuntu ps aux | grep hermes # Hermes 应在运行
2
3
4
5
6
# 常见问题
# 任务执行但 Hermes 未启动
原因: 路径错误或权限不足
解决:
# 检查路径是否正确
ls -la /home/felix/.hermes/hermes-agent/venv/bin/hermes
# 检查执行权限
chmod +x /home/felix/.hermes/hermes-agent/venv/bin/hermes
2
3
4
5
# WSL 启动但立即退出
原因: nohup 配置不正确
解决: 确保 > /dev/null 2>&1 & 在命令末尾
# 任务计划报错
查看错误:
# 查看任务历史日志
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" |
Where-Object {$_.Message -like "*StartWSLHermes*"} |
Select-Object -Last 10
2
3
4
# 用户登录后 Hermes 才启动
原因: 任务使用了当前用户而非 SYSTEM
解决: 确保使用 -User "NT AUTHORITY\SYSTEM"
# 管理任务
# 查看所有任务
Get-ScheduledTask | Where-Object {$_.TaskName -like "*WSL*"}
# 禁用任务
Disable-ScheduledTask -TaskName "StartWSLHermes"
# 启用任务
Enable-ScheduledTask -TaskName "StartWSLHermes"
# 删除任务
Unregister-ScheduledTask -TaskName "StartWSLHermes" -Confirm:$false
# 修改任务
# 更新执行路径
$action = New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu-24.04 -u root -- nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes gateway > /dev/null 2>&1 &"
Set-ScheduledTask -TaskName "StartWSLHermes" -Action $action
2
3
4
# 配置对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 任务计划(本文) | Windows 启动即运行,无需登录 | 配置稍复杂 |
| WSL cron @reboot | Linux原生方式 | 需要 WSL 先启动 |
| 启动脚本 | 简单直观 | 需要手动登录后执行 |
# 配置文件速查
# 完整 PowerShell 命令
# 1. 查看分发版
wsl -l -v
# 2. 清理旧任务(如有)
Unregister-ScheduledTask -TaskName "StartWSLHermes" -Confirm:$false
# 3. 创建任务
Register-ScheduledTask -TaskName "StartWSLHermes" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Action (New-ScheduledTaskAction -Execute "wsl.exe" `
-Argument "-d Ubuntu -u root -- nohup /home/felix/.hermes/hermes-agent/venv/bin/hermes gateway > /dev/null 2>&1 &") `
-User "NT AUTHORITY\SYSTEM"
# 4. 测试任务
Start-ScheduledTask -TaskName "StartWSLHermes"
# 5. 验证
wsl -d Ubuntu ps aux | grep hermes
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 相关链接
- Windows 任务计划程序文档:https://docs.microsoft.com/en-us/windows/win32/taskschd (opens new window)
- WSL 命令参考:https://docs.microsoft.com/en-us/windows/wsl/basic-commands (opens new window)
- Hermes 文档:https://hermes-agent.nousresearch.com (opens new window)
# 总结
通过 Windows 任务计划程序 + WSL 命令组合,可以实现 Windows 开机后无需任何手动操作,WSL 和 Hermes 就自动在后台运行。关键点:
- 使用
-User "NT AUTHORITY\SYSTEM"确保开机即运行 - 使用
-u root确保 WSL 内有足够权限 - 使用绝对路径指定 Hermes
- 使用
nohup和> /dev/null 2>&1 &确保后台化
配置完成后,你的 Hermes Agent 就能像服务器上的服务一样,7×24 小时在线运行。