SMB共享文件夹卸载异常:PHP仍可列出内容的问题排查
问题分析与解决方案
这种情况大概率是PHP运行的进程还在占用挂载点目录导致的——Linux系统里,如果有进程的当前工作目录处于挂载点下,执行umount后挂载点会被"隐藏"(命令行ls看不到内容),但占用它的进程依然能访问原来SMB共享里的文件内容。
下面是具体的排查和解决步骤:
1. 先确认挂载状态是否真的卸载
执行以下命令,检查/mnt/smb是否还在系统挂载列表中:
mount | grep /mnt/smb # 或者用df查看更直观的磁盘占用 df -h | grep /mnt/smb
如果还能看到这条挂载记录,说明之前的卸载命令没真正生效;如果看不到,那就是进程占用的问题无疑了。
2. 找出占用挂载点的进程
用下面的命令定位所有当前工作目录在/mnt/smb下的进程:
lsof +D /mnt/smb # 或者用fuser(如果没装可以先安装:Debian/Ubuntu用apt install psmisc,CentOS/RHEL用yum install psmisc) fuser -m /mnt/smb
你应该能看到PHP相关的进程,比如php-fpm、apache2或者nginx,具体取决于你的PHP运行环境。
3. 终止占用进程并彻底卸载
- 如果是PHP-FPM环境:重启PHP-FPM服务
# Debian/Ubuntu通用命令 systemctl restart php-fpm # 若指定版本,比如php7.4-fpm systemctl restart php7.4-fpm # CentOS/RHEL systemctl restart php-fpm - 如果是Apache(PHP作为模块运行):重启Apache服务
# Debian/Ubuntu systemctl restart apache2 # CentOS/RHEL systemctl restart httpd - 重启完成后,再执行一次卸载命令确保彻底生效:
umount /mnt/smb
4. 验证结果
现在分别测试两种场景:
- 命令行执行
ls /mnt/smb,应该显示为空(或者提示目录不存在,如果你没手动重建这个目录) - 运行包含
ls /mnt/smb的PHP文件,结果会和命令行一致,再也看不到SMB共享的内容了
另外建议下次卸载SMB共享前,先确认没有任何进程在使用该挂载点,避免出现这种"假卸载"的情况。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

