DSH(DeepSeek Harness)开机自启后台运行配置教程

目标:让 DSH Web(dsh web,默认端口 3080)开机自动启动、后台运行,
不再需要每次打开终端手动敲命令,也不占用终端窗口。

1. 背景与方案说明

现在的问题

每次需要使用 DSH 时,都要:

  1. 打开终端窗口
  2. 手动输入 dsh web
  3. 终端窗口必须一直开着(服务在前台运行,关窗口服务就停)

推荐方案: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前台进程型服务,进程退出即视为服务结束
WorkingDirectorydsh 的运行/工作区目录,换工作区时改这里
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-web

Q5:不想要开机自启了

systemctl --user disable --now dsh-web
rm ~/.config/systemd/user/dsh-web.service
systemctl --user daemon-reload

7. 备选方案:桌面登录自启(.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,不再需要终端窗口。

最后修改:2026 年 08 月 29 日
如果觉得我的文章对你有用,请随意赞赏