尝试访问使用 CIFS 装载的远程文件夹在断开连接时挂起

2024-01-29

这个问题是一个扩展那个问题 https://stackoverflow.com/questions/17929294/qdir-hangs-on-accessing-cifs-remote-folder-when-disconnected.

再说一次:我在 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 配置。
  2. 如何检查远程文件夹是否仍然安装并且没有被锁定?
  3. 如何检查文件夹是否存在并且未被锁定?

你的问题:“一个无法访问的网络文件系统”是一个众所周知的例子,它会触发linux挂起的任务这与僵尸进程完全不一样(杀死父PID不会做任何事情)

挂起任务是触发系统调用的任务,该系统调用会导致内核出现问题,从而导致系统调用永远不会返回。 主要特点是任务被调度程序声明为“D”状态,这意味着程序处于不可中断状态。这意味着您无法阻止您的程序:您可以触发任务的所有信号,但它不会响应。启动数百个 SIGTERM/SIGKILL 没有任何作用!

我的旧内核就是这种情况:当我的 nfs 服务器崩溃时,我需要重新启动客户端以终止使用文件系统的任务。 IS很久以前就编译过了(我的硬盘上仍然有构建树)在配置过程中我在 lib/Kconfig.debug 中看到了这一点:

config DETECT_HUNG_TASK
    bool "Detect Hung Tasks"
    depends on DEBUG_KERNEL
    default LOCKUP_DETECTOR
    help
      Say Y here to enable the kernel to detect "hung tasks",
      which are bugs that cause the task to be stuck in
      uninterruptible "D" state indefinitiley.

      When a hung task is detected, the kernel will print the
      current stack trace (which you should report), but the
      task will stay in uninterruptible state. If lockdep is
      enabled then all held locks will also be reported. This
      feature has negligible overhead.

它只是建议在检测时检测此类tash或panic:我不检查最近的内核是否确实可以解决问题(你的问题好像是这样的),但我认为不值得启用它。

还有第二个问题:通常情况下,检测会在 120 秒后发生,但我还看到了一个 Konfig 选项:

config DEFAULT_HUNG_TASK_TIMEOUT
    int "Default timeout for hung task detection (in seconds)"
    depends on DETECT_HUNG_TASK
    default 120
    help
      This option controls the default timeout (in seconds) used
      to determine when a task has become non-responsive and should
      be considered hung.

      It can be adjusted at runtime via the kernel.hung_task_timeout_secs
      sysctl or by writing a value to
      /proc/sys/kernel/hung_task_timeout_secs.

      A timeout of 0 disables the check.  The default is two minutes.
      Keeping the default should be fine in most cases.

这也适用于内核线程:例如:为熔断文件系统上的文件创建一个循环设备。然后使控制熔丝文件系统的用户空间程序崩溃! 你应该得到一个Ktread,其名称的形式为loopX(X通常对应于你的环回设备号)!

网页链接:

https://unix.stackexchange.com/questions/5642/what-if-kill-9-does-not-work 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 http://www.linuxquestions.org/questions/linux-general-1/kill-a-hung-task-when-kill-9-doesn't-help-697305/

http://forums-web2.gentoo.org/viewtopic-t-811557-start-0.html 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/1189978

http://comments.gmane.org/gmane.linux.kernel.cifs/7674 http://comments.gmane.org/gmane.linux.kernel.cifs/7674 (这个情况和你的情况很相似)

对于您的三个问题:您有答案:这可能是由于 vfs linux 内核层中的一个众所周知的错误! (没有 CIFS 超时)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试访问使用 CIFS 装载的远程文件夹在断开连接时挂起 的相关文章

  • 启用 mod_http2 并在conf文件中设置协议后,HTTP/2配置未运行[重复]

    这个问题在这里已经有答案了 在看似正确的安装之后 HTTP 2 似乎并未运行 我运行的是 CentOS 7 我安装了最新版本的 Apache 版本 httpd 2 4 35 5 el7 x86 64 并一直在尝试让 HTTP 2 正常工作
  • 无法在 CentOS 7 上启动 postgresql 服务

    无法在 CentOS 7 上启动 postgresql 9 5 我关注了这个页面 https wiki postgresql org wiki YUM Installation https wiki postgresql org wiki
  • s3 安装在容器内。如何将其暴露给主机?

    我一直在考虑是否有一个容器可以安装 s3 桶并将其暴露在外面 I used https github com FindHotel aws s3 mount https github com FindHotel aws s3 mount将 s
  • 在docker中挂载两个嵌套的只读挂载点

    我有一个docker compose文件运行 PHP 并以嵌套方式安装一些卷 它已经工作了两年了 最近我又尝试了一次 但失败了 至少在 Docker for WSL 2 上是这样 以下是 docker compose 文件中挂载的卷 vol
  • 在Linux中使用自定义规则在多个端口上运行的SSH服务[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在努力设置一台在多个端口上运行 SSH 服务的服务器 例如端口 22 和 5522 这些端口应该具有一组不同的规则 即 我们为端口 2
  • iOS 8 - 如何注册要包含在系统共享菜单中的应用程序?

    The dialog below comes up if you share an image from the Photos app on iOS 8 devices How to get an app into the red circ
  • 如何在 CentOs 中安装 php-xml

    我正在尝试在 CentOs 6 5 上安装 php xml 我输入命令yum install php xml 我收到此错误 Loaded plugins fastestmirror Loading mirror speeds from ca
  • apache 和 httpd 正在运行,但我看不到我的网站 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已经在我的服务器上安装了 apache 但是我无法通过我的服务器 IP 浏览我的网站 apache 的设置是 var www htdocs 下的单帐
  • 在 php.ini 上启用curl_exec

    我想运行带有curl 的php 脚本 但以下功能被 php ini 禁用 exec passthru shell exec 系统 proc open popen curl exec curl multi exec show source 我
  • 如何从 Mac OS X 交叉编译到 Linux x86?

    我正在运行 Mac OS X 10 5 8 并希望使用 GCC 4 1 2 为目标 CentOS 5 3 进行编译 我怎么能 编译GCC 4 1 2工具链及相关工具 使用该工具交叉编译目标 CentOS 5 3 任何帮助是极大的赞赏 最简单
  • 将 awk 输出保存到变量 [重复]

    这个问题在这里已经有答案了 谁能帮我解决这个问题吗 我正在尝试将 awk 输出保存到变量中 variable ps ef grep port 10 grep v grep port 10 awk printf s 12 printf var
  • Debian 7、fstab、mount.cifs 参数无效

    我尝试挂载 cifs 但出现以下错误 但没有找到该错误 mount a mount error 22 Invalid argument 我尝试在我的 etc fstab 中 192 168 0 1 ShareRep home user sh
  • CentOS 的 init.d celery 脚本?

    我正在编写一个使用 celery 的 Django 应用程序 到目前为止 我一直在 Ubuntu 上运行 但我正在尝试部署到 CentOS Celery 为基于 Debian 的发行版提供了一个很好的 init d 脚本 但它不适用于基于
  • 在perl中串行处理XML数据

    我想知道在我的情况下 哪种 XML 解析器最适合 Perl 我读了很多书并尝试过XML LibXML and XML SAX 第一个使用了太多内存 第二个对我来说似乎没有那么快 即使在关闭纯 Perl 解析器之后 我的需求相当具体 我通过以
  • 共享图像的正确方法(使用意图)

    我在应用程序中创建图像 并希望共享这些社交网络 facebook 邮件应用程序 gmail 以及其他可以 接收 图像的应用程序 问题的根源 我认为 是我不想使用外部存储作为图像的基础 我想使用我的数据文件夹或缓存文件夹 因为它们都不需要任何
  • 无法使用 git 克隆任何存储库

    我尝试克隆一些存储库 但总是遇到相同的错误 我在哪里可以找到有关此错误的更多信息 错误日志文件或类似的文件 或者也许有人知道可能出了什么问题 git clone http github com creationix nvm git nvm
  • 出现错误 /usr/bin/env: 节点:权限被拒绝

    我已经在我的服务器 Centos 上完成了 ODOO v9 安装 一切都已安装成功 登录页面也可以正常工作 但登录后我收到一个包含以下错误的页面 usr bin env node Permission Denied 我尝试更改权限 但我的问
  • C# CreateSymbolicLink 不遵循共享访问

    我不确定这只是 C 问题还是 Windows 限制 我有一台运行我的程序的服务器 它在共享文件夹中创建符号链接 我可以通过此链接从具有正常磁盘路径和共享路径的服务器进行访问 如果我尝试与其他电脑访问同一共享 我将无法访问链接的文件 我确实可
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • C# 在类之间共享代码

    在使用 C 的 Visual Studio 2008 中 跨多个类和源文件共享代码的最佳方式是什么 继承不是解决方案 因为类已经具有有意义的层次结构 是否有一些类似于 C 包含文件的简洁功能 可以让您在另一个类中的任意位置插入代码 EDIT

随机推荐