此问题是that question的延伸。
再一次:我在CentOS 6.0下工作,我有一个远程win7文件夹,安装有:
mount -t cifs //PC128/mnt /media/net -o "username=WORKGROUP\user,password=pwd,rw,noexec,soft,uid=user,gid=user"
当远程文件夹不可用时(例如,网络电缆被拔出),试图访问远程文件夹会锁定我正在使用的应用程序。起初,我发现QDir::exists()会导致锁定20-90秒(我仍然不知道为什么会有这样的差异),进一步,我发现任何对stat()函数的调用都会导致应用程序锁定。
我遵循了上面主题中的建议,我将QDir::exists()调用(以及稍后对stat()函数的调用)移到了另一个线程,但这并没有解决问题。当连接突然丢失时,应用程序仍然挂起。Qt跟踪显示锁在内核的某个地方:
0 __kernel_vsyscall
1 __xstat64@GLIBC_2.1 /lib/libc.so.6
2 QFSFileEnginePrivate::doStat stat.h
我也试图检查远程共享是否仍然挂载之前,试图访问文件夹本身,但它没有帮助。方法,如:
mount | grep /media/net
显示即使没有到网络活动连接,共享文件夹仍被装载。
正在检查文件夹状态差异,例如:
stat -fc%t:%T /media/net/ != stat -fc%t:%T /media/net/..
也会挂起约20秒。
所以我有几个问题:
1.有什么办法可以更改CIFS超时吗?我确实试过找出,但似乎没有合适的参数,也没有CIFS配置。
1.如何检查远程文件夹是否仍处于装载状态且未被锁定?
1.我如何检查文件夹是否存在并且不被锁定?
2条答案
按热度按时间e1xvtsh31#
您的问题:“一个无法访问的网络文件系统”是一个非常著名的例子,它会触发linux挂起任务,这与僵尸进程完全不同(杀死父PID不会做任何事情)
挂起任务是指触发了系统调用的任务,该系统调用导致内核出现问题,因此系统调用永远不会返回。主要的特点是,调度程序将任务声明为“D”状态,这意味着程序处于不可中断状态。这意味着您无法停止程序:你可以触发所有的信号到任务,它不会响应。发射数百个SIGTERM/SIGKILL什么也不做!
这是我的老内核的情况:当我的nfs服务器崩溃时,我需要重新启动客户端来终止使用文件系统的任务。2我很久以前编译过它 (我的硬盘上仍然有构建树),在配置过程中我在lib/Kconfig.debug中看到了这一点:
它只是建议在发现时检测这种碰撞或恐慌:我没有检查最近的内核是否真的可以解决这个问题 (这似乎是你的问题),但我认为它不值得启用它。
还有第二个问题:正常情况下,检测发生在120秒后,但我也看到了一个Konfig选项:
这也适用于内核线程:例如:在一个文件系统上创建一个循环设备。2然后使控制文件系统的用户空间程序崩溃!3你应该得到一个名字为loopX的Ktread(X通常对应于你的环回设备号)HUNGing!
网页链接:
https://unix.stackexchange.com/questions/5642/what-if-kill-9-does-not-work(看ultrasawblade写的答案)
http://www.linuxquestions.org/questions/linux-general-1/kill-a-hung-task-when-kill-9-doesn 't帮助-697305/
http://forums-web2.gentoo.org/viewtopic-t-811557-start-0.html
http://comments.gmane.org/gmane.linux.kernel/1189978
http://comments.gmane.org/gmane.linux.kernel.cifs/7674(这是一个与您的案例类似的案例)
在你的案例中有三个问题:你有答案:这可能是由于vfs linux内核层中的一个众所周知的bug!(没有CIFS超时)
7rfyedvj2#
经过多次试验和错误,我找到了一个解决方案,坚持。
_netdev选项很重要,因为我们要挂载网络设备。如果系统遇到网络问题,客户端可能会在 Boot 过程中挂起。
https://www.redhat.com/sysadmin/samba-windows-linux