用dsh(DeepSeek Harness)本地 Web GUI 调试 Agent 时,最扫兴的莫过于:终端窗口一关,服务跟着退出,页面从此打不开。这篇文章先用一分钟讲清为什么进程会随终端关闭而死,再给出一个只需配置
|
用 dsh(DeepSeek Harness)本地 Web GUI 调试 Agent 时,最扫兴的莫过于:终端窗口一关,服务跟着退出,页面从此打不开。这篇文章先用一分钟讲清"为什么进程会随终端关闭而死",再给出一个只需配置一次、日常只敲两个 4 字符命令的完整方案——dshd 后台启动、dsht 彻底停止,从此关终端不慌,重启不丢会话。 一、场景:你大概率踩过的坑dsh 是一款在本地运行的 AI Harness 工具(npm 包 @deepseek-ai/dsh),它自带一个 Web GUI,默认地址是:
很多人(包括我)第一次都是这样启动的:
然后打开浏览器开始干活。干到一半想合上电脑或者清理终端窗口,结果终端一关,Web 也打不开了——因为刚才那条命令是"前台"跑在终端里的。 二、原理:为什么会这样?在类 Unix 系统(macOS/Linux)里,终端窗口关闭时,shell 退出并会给自己的子进程发送一个 SIGHUP(挂断)信号:
要让服务不随终端退出,思路只有一个:让进程脱离终端会话。常见手段:
判断一个进程是否已经"自由",有一个很直观的办法——看它的父进程(PPID):
PPID 是 1(被 init/launchd 收养)说明已脱离终端;PPID 还是某个 shell,说明它仍挂在终端下,关终端会一起死。 三、一次性配置(约 1 分钟)下面这套配置只做一次:创建一个启动脚本 + 在 ~/.zshrc 里定义两个命令。日常你只需要记 dshd 和 dsht。 3.1 前置:确认 dsh 已全局安装代码语言:bash AI代码解释
提示:如果之前用 npx 临时跑过 dsh,全局安装后建议清理一下 npx 缓存里的旧副本(~/.npm/_npx 下对应目录),避免"一份程序两处存放"的困惑。数据不受影响——dsh 的用户数据统一放在 ~/.dsh。 3.2 创建启动脚本 ~/start-dsh.sh
3.3 赋予执行权限
3.4 在 ~/.zshrc 末尾追加两个命令
3.5 让配置立即生效
四、日常使用启动(或确认在运行)
第一次会看到:
如果它已经在运行,则只会提示地址并退出——天然防重复启动。 验证"关终端也不断"启动用的终端窗口直接关掉,然后新开一个终端验证:
或者不带任何依赖地验证:
彻底停止
没在运行时执行 dsht,会友好地提示 dsh 未在运行,而不是报一堆 kill 用法错误。 查看日志
五、脚本设计解读这段写给想"知其所以然"的同学。
六、常见问题Q1:我现在的 dsh 是前台跑的,怎么平滑切换到后台模式? 先在前台那个终端按 Ctrl+C 停掉旧进程(页面会短暂断开,正常),再执行 dshd,最后刷新 http://127.0.0.1:3080。历史会话不会丢。 Q2:想换端口怎么办? DSH_PORT=8080 dshd。注意端口需与 dsh 自身配置保持一致;dsht 默认按 3080 找进程,如换端口需要同步修改。 Q3:电脑重启后呢? 进程会随关机结束,开机后执行一次 dshd 即可。想做到开机自启,可以把它包成 launchd(macOS)或 systemd service(Linux),这是另一篇文章的话题。 Q4:关终端后网页打不开,怎么排查? 依次检查:① dshd 是否提示"已在运行";② lsof -nP -iTCP:3080 -sTCP:LISTEN 是否有输出;③ tail -n 50 ~/.dsh/logs/web.log 看启动报错;④ 浏览器是否走了代理导致访问不到 127.0.0.1。 七、小结
三个避坑提醒,写代码和运维时都用得上:
配置一次,之后每次只需 dshd 四个字符——把时间留给真正的问题,而不是和终端窗口搏斗。 |
2023-12-25
2024-08-11
2024-10-21
2024-08-26
2024-08-27