前言:一个让人抓狂的场景

在日常办公中,很多公司都会使用群晖NAS作为文件共享服务器。但当某个同事正在编辑Excel或Word文档时,电脑突然蓝屏死机、强制关机或网络断线,紧接着整个办公室就炸锅了——其他所有人都只能只读打开这个文件,一编辑就提示"文件已被XX占用"

此时,那个死机的同事可能已经下班走人,甚至电脑还没重启。作为管理员,你该怎么办?

问题根源:SMB协议的文件锁机制

这一切的罪魁祸首是SMB(Server Message Block)协议的文件锁机制。当用户通过SMB打开一个文件时,NAS会为这个文件创建一个锁定记录,防止多人同时编辑造成数据冲突。正常关闭文件时,锁会自动释放。

但如果用户电脑非正常断开(死机、断电、强制关机),SMB会话没有机会发送"我关文件了"的信号,导致NAS认为这个会话还在活跃,文件锁一直挂着。

解决方案:通过SSH手动杀死僵尸进程

群晖DSM后台界面无法直接释放单个文件的锁,我们需要通过SSH登录NAS,用命令行精确"狙击"那个卡死的进程。

第一步:开启群晖SSH功能

  1. 登录群晖DSM网页管理界面

  2. 打开 控制面板终端机和SNMP

  3. 勾选 启动SSH功能,端口保持默认的22(或自定义)

  4. 点击 应用

![开启SSH功能示意图]

⚠️ 安全问题:用完记得关掉SSH,避免成为黑客攻击入口。

第二步:SSH远程登录NAS

打开你电脑的命令行工具:

  • Windows:按 Win+R,输入 cmd

  • macOS/Linux:打开终端(Terminal)

输入以下命令(替换成你NAS的实际信息):

ssh admin@你的NAS的IP地址 -p 22
  • admin:NAS的管理员账号

  • 你的NAS的IP地址:例如 192.168.1.100

  • -p 22:SSH端口号,默认22

首次连接会提示确认指纹,输入 yes 回车。然后输入管理员密码(输入时不显示,正常敲完回车即可)。

第三步:切换到root管理员权限

登录后,你发现直接运行 smbstatus 会报错:

smbstatus only works as root!

因为查看SMB会话状态需要root权限。输入以下命令切换到root:

sudo -i

再次输入管理员密码,提示符从 $ 变成 #,说明已是root用户。

第四步:查找卡死的文件进程

使用 smbstatus 命令查看所有当前的SMB连接:

smbstatus

输出会很多,重点关注第一列(进程PID)和最后一列(文件路径)

PID     UID     DENY_MODE    ACCESS   ...    FILE
14474   1493    DENY_WRITE   WRONLY   ...    /volume1/共享文件夹/销售部/2026对账单/2236移远.xlsx
14474   1493    DENY_WRITE   RDWR     ...    /volume1/共享文件夹/销售部/2026对账单/~$2236移远.xlsx

关键信息:

  • PID(第一列):进程ID,例如 14474

  • 文件路径(最后一列):被锁死的文件完整路径

  • 临时文件~$开头 的文件是Excel/Word生成的锁标记文件

第五步:用grep精准筛选目标文件

如果SMB连接很多,可以用grep过滤出你关心的那个文件:

smbstatus | grep "2236移远.xlsx"

或者过滤特定用户:

smbstatus | grep "死机同事的用户名"

第六步:kill掉卡死的进程

找到PID后,用 kill 命令强制终止这个进程:

kill -9 14474
  • -9 是强制终止信号,不给进程任何清理机会

关键点:只杀掉这一个进程,其他同事的编辑会话完全不受影响,不像 smbcontrol close-share 会把整个共享文件夹的人全踢掉。

第七步:验证结果

让同事重新打开那个文件,应该可以正常编辑了。如果需要确认进程已消失:

ps aux | grep 14474

没有任何输出就说明杀干净了。

第八步:收尾工作

  1. 退出root用户:输入 exit

  2. 退出SSH连接:输入 exit

  3. 回到DSM控制面板,关闭SSH功能

完整命令速查表

步骤

命令

说明

SSH登录

ssh admin@192.168.1.100 -p 22

替换IP和端口

切root

sudo -i

输入密码

查看所有连接

smbstatus

列出所有SMB会话

筛选文件名

smbstatus | grep "文件名.xlsx"

精准定位

杀死进程

kill -9 14474

替换为实际PID

退出root

exit

回到普通用户

退出SSH

exit

断开连接

常见问题FAQ

Q:为什么删掉~$开头的临时文件也能解决问题?

A:~$2236移远.xlsx 是Excel的锁定标记文件,只要它存在,Excel就认为文件被占用。删掉它,锁就释放了。但这个方法不一定100%有效,因为主进程可能还在。

Q:kill -9 会不会损坏文件?

A:不会。如果用户已经保存过内容,文件数据已经在NAS上了。kill -9 只是断掉这个SMB会话,可能会丢失该用户最后一次未保存的修改,但文件本身是安全的。

Q:如果文件还在被编辑,我能强制获取编辑权吗?

A:可以,但这个操作会强行抢占,可能导致正在编辑的人丢数据。建议先确认死机同事确实不在线,再用这个方法。

Q:我执行smbcontrol smbd close-share "共享文件夹"把所有人都踢了,怎么办?

A:不用担心,大家重新打开文件就能连回来。但这个方法太粗暴,不建议常规使用。

预防措施

  1. 设置较短的SMB会话超时:在群晖控制面板 → 文件服务 → SMB → 高级设置中,调整"会话超时"时间。

  2. 养成好习惯:提醒同事离开工位前随手保存并关闭文件。

  3. 启用文件版本管理:群晖的Snapshot Replication(快照)功能可以定期备份文件版本,即使文件损坏也能恢复。

  4. 考虑使用Office Online协同编辑:如果有条件,可以部署Office Online或OnlyOffice等协同编辑方案,多人同时在线编辑,彻底告别文件锁问题。

结语

群晖NAS作为一款优秀的存储设备,SMB文件锁是保护数据一致性的必要机制。但当异常发生时,掌握通过SSH精确kill进程的技能,是每个NAS管理员的必备技能。

记住核心思路:

  1. SSH登录 → 2. 切root → 3. smbstatus查PID → 4. grep过滤 → 5. kill -9干掉 → 6. 收工

整个过程熟练的话三分钟搞定,比重启SMB服务、重启NAS要精准高效得多,也不会影响到其他正在正常办公的同事。


📌 最后提醒:操作有风险,建议先在测试环境熟悉一遍流程。生产环境操作前最好确认一下那个"死机"的同事确实已经离线。

希望这篇博客能帮到你,如果有任何问题,欢迎留言交流!😊