DSH(DeepSeek Harness)开机自启后台运行配置教程
目标:让 DSH Web(dsh web,默认端口 3080)开机自动启动、后台运行,
不再需要每次打开终端手动敲命令,也不占用终端窗口。
1. 背景与方案说明
现在的问题
每次需要使用 DSH 时,都要:
- 打开终端窗口
- 手动输入
dsh web - 终端窗口必须一直开着(服务在前台运行,关窗口服务就停)
推荐方案:systemd 用户服务
- ✅ 开机自动启动(登录桌面即启动)
- ✅ 纯后台运行,无终端窗口
- ✅ 崩溃自动重启(
Restart=on-failure) - ✅ 日志统一由 journald 管理,方便查看
- ✅ 注销/停止/重启都可随时用命令控制
备选方案见第 6 节(桌面登录自启 .desktop 文件),仅在特殊情况下使用。适用范围
- Linux 图形桌面(本机为中文桌面
~/桌面) - 已通过 nvm 安装 Node.js,
dsh位于/home/yjxrmk/.nvm/versions/node/v24.20.0/bin/dsh - DSH Web 默认监听
127.0.0.1:3080
2. 服务文件内容
服务文件位置:~/.config/systemd/user/dsh-web.service
[Unit]
Description=DeepSeek Harness Web (dsh web)
# 开机联网后再启动,避免启动时网络未就绪
After=network-online.target
[Service]
Type=simple
# 以默认工作区作为 dsh 的运行目录(换工作区时改这里)
WorkingDirectory=/home/yjxrmk/Myproject
# 让 /usr/bin/env node 能通过 PATH 找到 nvm 里的 node
Environment=PATH=/home/yjxrmk/.nvm/versions/node/v24.20.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/home/yjxrmk/.nvm/versions/node/v24.20.0/bin/dsh web
# 崩溃/异常退出后自动重启
Restart=on-failure
RestartSec=3
[Install]
WantedBy=default.target各字段含义
| 字段 | 作用 |
|---|---|
Description | 服务说明(systemctl status 里显示) |
After=network-online.target | 等待网络就绪后再启动 |
Type=simple | 前台进程型服务,进程退出即视为服务结束 |
WorkingDirectory | dsh 的运行/工作区目录,换工作区时改这里 |
Environment=PATH=... | 让脚本 shebang 里的 /usr/bin/env node 能找到 nvm 中的 node |
ExecStart | 实际启动命令(等价于终端里敲 dsh web) |
Restart=on-failure | 非正常退出时自动重启 |
RestartSec=3 | 重启前等待 3 秒 |
WantedBy=default.target | 随用户会话默认启动目标启用,实现开机自启 |
如何创建/编辑该文件
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/dsh-web.service # 粘贴上面的内容,Ctrl+O 保存,Ctrl+X 退出3. 启用步骤(核心操作)
⚠️ 重要:先停掉现在手动跑着的 dsh。
回到你敲dsh web的那个终端,按Ctrl+C(或直接关掉那个终端窗口)。
因为新服务同样监听 3080,不先停会导致端口冲突、服务启动失败。
然后在任意终端依次执行:
# 1. 让 systemd 重新读取服务文件
systemctl --user daemon-reload
# 2. 启用并立即启动
systemctl --user enable --now dsh-web(可选)开机后无需登录桌面也自动启动
默认情况下,用户服务在登录桌面后才启动。如果希望开机即启动
(例如以后用 SSH/远程访问),再执行:
loginctl enable-linger yjxrmk执行后,即使不登录图形桌面,服务也会在开机时自动运行。
4. 验证是否成功
# 查看服务状态:应显示 active (running)
systemctl --user status dsh-web
# 查看启动日志(最后几行)
journalctl --user -u dsh-web -n 50 --no-pager用浏览器打开 http://127.0.0.1:3080,能正常打开即成功。
验证开机自启:重启电脑后,不打开任何终端,直接访问
http://127.0.0.1:3080,页面可用即说明自启生效。
5. 日常管理命令速查表
| 操作 | 命令 |
|---|---|
| 启动 | systemctl --user start dsh-web |
| 停止 | systemctl --user stop dsh-web |
| 重启 | systemctl --user restart dsh-web |
| 查看状态 | systemctl --user status dsh-web |
| 查看实时日志 | journalctl --user -u dsh-web -f |
| 查看最近 50 行日志 | journalctl --user -u dsh-web -n 50 --no-pager |
| 取消开机自启(并停止) | systemctl --user disable --now dsh-web |
| 修改配置后重新加载 | systemctl --user daemon-reload && systemctl --user restart dsh-web |
6. 常见问题排查(FAQ)
Q1:systemctl --user 报「Failed to connect to bus」
原因:当前 shell 不在图形登录会话内(例如 SSH 进入、或使用了不继承
用户总线的方式)。
解决:在图形桌面里打开的终端中执行;或先执行export XDG_RUNTIME_DIR=/run/user/$(id -u) 再试。
Q2:dsh web 启动失败,日志提示端口被占用
原因:还有旧的手动实例在跑(3080 被占)。
解决:
# 找到占用 3080 的进程
ss -ltnp | grep 3080
# 停掉它(把 PID 换成上面查到的实际编号)
kill <PID>Q3:启动后立即退出(status 显示 failed / exiting)
先看日志找原因:
journalctl --user -u dsh-web -n 100 --no-pager常见原因与对策:
- 找不到 node:确认 nvm 路径正确;或改用完整调用:
ExecStart=/home/yjxrmk/.nvm/versions/node/v24.20.0/bin/node /home/yjxrmk/.nvm/versions/node/v24.20.0/bin/dsh web - 工作区目录不存在:确认
WorkingDirectory指向存在的目录。 - 凭据/API Key 缺失:检查
~/.dsh/.credentials.yaml与~/.dsh/settings.yaml(模型/提供方配置见另一份说明)。
Q4:改了 WorkingDirectory 想换工作区
nano ~/.config/systemd/user/dsh-web.service # 修改 WorkingDirectory
systemctl --user daemon-reload
systemctl --user restart dsh-webQ5:不想要开机自启了
systemctl --user disable --now dsh-web
rm ~/.config/systemd/user/dsh-web.service
systemctl --user daemon-reload7. 备选方案:桌面登录自启(.desktop 文件)
如果不想用 systemd(例如某些桌面环境不完整),可改用登录自启:
文件位置:~/.config/autostart/dsh-web.desktop
[Desktop Entry]
Type=Application
Name=DSH Web
Comment=DeepSeek Harness Web
Exec=/home/yjxrmk/.nvm/versions/node/v24.20.0/bin/dsh web
Terminal=false
X-GNOME-Autostart-enabled=true差异对比:
| 对比项 | systemd 用户服务(推荐) | 登录自启 .desktop |
|---|---|---|
| 开机自启 | ✅(可选无需登录也启动) | 仅登录桌面后启动 |
| 后台无终端 | ✅ | ✅ |
| 崩溃自动重启 | ✅ | ❌ |
| 日志管理 | ✅ journald | ❌ 无统一日志 |
| 注销后继续运行 | 视 linger 而定 | ❌ 随会话结束 |
两种方式不要同时启用,否则会重复启动、端口冲突。
8. 完整操作流程速览(照着做即可)
# ① 关掉当前终端里手动跑着的 dsh(去那个终端按 Ctrl+C)
# ② 创建服务文件(如果还没有)
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/dsh-web.service
# 粘贴第 2 节的内容并保存
# ③ 启用
systemctl --user daemon-reload
systemctl --user enable --now dsh-web
# ④ (可选)开机不登录也自启
loginctl enable-linger yjxrmk
# ⑤ 验证
systemctl --user status dsh-web
# 浏览器打开 http://127.0.0.1:3080完成!以后开机即可直接用 DSH,不再需要终端窗口。