Raspbian系统下遍历NFS挂载NAS的os.walk循环无法完成问题
你遇到的脚本无报错挂起问题,核心原因大概率是NFS挂载配置或NAS服务端异常,和Python代码逻辑无关。
问题定位步骤
- 先确认进程状态:执行
ps aux | grep 你的脚本文件名,如果进程状态显示为D,说明进程处于不可中断睡眠状态,这是NFS硬挂载下服务端无响应的典型特征,直接实锤是NFS挂载侧问题。 - 排除Python代码问题:直接在树莓派终端执行
find /home/mnt/cams -type f -name "*.avi",如果find命令也出现同样的挂起情况,完全排除代码问题,故障点在存储或挂载配置。 - 额外说明你代码里的逻辑bug:你写的
if not ("trash" or "Cameras") in name逻辑错误,("trash" or "Cameras")的运算结果永远是trash,相当于你只过滤了文件名带trash的内容,没有过滤Cameras,修正写法为if "trash" not in name and "Cameras" not in name即可,这个问题不会导致脚本挂起,只是过滤逻辑不符合预期。
解决方案
- 调整NFS挂载参数:默认的NFS硬挂载(hard mount)会在服务端无响应时永远阻塞访问进程,你可以改为软挂载加超时重试配置,挂载时添加参数
soft,timeo=10,retrans=3(timeo单位是0.1秒,10就是1秒超时,retrans是重试次数),临时挂载命令示例:mount -t nfs -o soft,timeo=10,retrans=3 [NAS的NFS共享路径] /home/mnt/cams,需要永久生效则修改/etc/fstab中对应挂载项的参数即可。 - 定位NAS异常目录:你可以修改代码的os.walk路径为NAS下的子目录逐个遍历,定位到具体触发挂起的目录后,检查该目录是否存在损坏的inode、循环软链接、特殊权限文件等异常,在NAS侧修复对应问题即可。
- 确认底层调用状态:如果上述排查没有结果,可以用
strace -p [脚本进程ID]命令查看进程挂起时卡住的系统调用,若卡在getdents64、stat等文件系统相关调用上,即可完全确认是NFS服务端或网络传输的问题。
内容的提问来源于stack exchange,提问作者stain
相关产品推荐
相关产品推荐

