【问题标题】:stat() system call is being blockedstat() 系统调用被阻塞
【发布时间】:2014-07-21 11:15:26
【问题描述】:
当我尝试对损坏的文件进行统计时,

stat() 系统调用需要很长时间。幻数已损坏。 在我的源代码中的这个调用之后,我有一个打印,它在一些延迟后打印。 我不确定 stat() 是否正在对呼叫进行任何重试。如果有任何可用的文档,请分享。这将是很大的帮助。

它返回输入输出错误。错误 5 EIO。所以我不确定文件或文件系统是否已损坏

【问题讨论】:

  • stat 系统调用不会读取实际的文件数据,因此文件数据是否损坏无关紧要。 disk 是否损坏可能很重要。检查系统日志,例如dmesg 显示。
  • 有关 stat() 的更多信息,请参阅 stat 手册页。
  • 如果您收到EIO,这可能意味着磁盘损坏或损坏,或者磁盘控制器损坏,或者您计算机中的其他东西损坏。您应该尽可能多地备份,然后搜索问题,以及如何做到这一点对于 SO 来说是题外话。如果您需要帮助,请转到superuser.com
  • 我知道了 Joachim.. 但我的问题是.. 这会在返回返回值方面增加实质性的交易吗??
  • 如果磁盘有问题,它确实会延迟该磁盘上的所有操作。您访问它的次数越多,它甚至可能变得越损坏。

标签: c linux multithreading shell


【解决方案1】:

这可能是由老化或损坏的旋转磁盘上的坏块引起的。还有两种可能同时出现的症状:

  • 内核在系统日志中报告的大量显式 I/O 错误。

  • load average 突然飙升。发生这种情况是因为等待 I/O 的进程在 uninterrupted sleep 中,而内核忙循环试图与硬件交互,导致系统暂时变得迟缓。您无法阻止这种情况发生,也无法在不间断的睡眠中终止进程。这是一种操作系统的致命弱点。

如果是这种情况,请卸载相关文件系统并在其上运行e2fsck -c -y。如果它是根文件系统,您将需要,例如,使用 live CD 引导系统并从那里进行操作。来自man e2fsck

-c

此选项使 e2fsck 使用 badblocks(8) 程序对设备进行只读扫描 为了找到任何坏块。如果发现任何坏块,则将它们添加到坏块中 inode 以防止它们被分配到文件或目录。如果此选项指定了两次,则将使用非破坏性读写测试完成坏块扫描。

注意-cc 需要很长 时间; -c 应该足够了。 -y 会自动回答所有问题,您不妨这样做,因为可能有很多问题。

您可能会丢失一些数据(之后查看/lost+found);希望系统仍然可以启动。至少,文件系统现在可以安全挂载了。磁盘本身可能会也可能不会持续一段时间。我已经这样做了,并让它们在几个月内保持良好状态,但不要指望它

如果这是一个 SMART 驱动器,您可以使用pparently some other tools 来诊断和处理相同的问题,尽管我在这里概述的内容可能已经足够好了。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2012-11-17
    • 2023-03-09
    • 1970-01-01
    • 2014-07-15
    • 2015-05-24
    • 2013-10-19
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多