当 NFS 中断时尝试启动程序时,如何阻止 bash 挂起

当 NFS 中断时尝试启动程序时,如何阻止 bash 挂起

我目前正在经历Ubuntu 13.10 中的一个错误这意味着当我在暂停后恢复计算机时,网络连接不会恢复。我有几个 NFS 安装,并且因为它们处于挂起状态,所以每当我尝试在命令行上运行任何内容(例如该错误报告中的解决方法:)时,nmcli cli sleep falseshell 都会挂起。我所说的“挂起”是指它们对任何信号(Ctrl-C、Ctrl-Z、kill 等)都没有响应。

当我使用绝对路径(即例如。/usr/bin/nmcli)时,它按预期运行良好。当我恢复网络连接时,所有挂起的进程都会恢复并完成执行。

我很困惑为什么会发生这种情况。我当前的怀疑是 bash 正在尝试在 NFS 安装目录之一中搜索我尝试运行的命令。但我的PATH不包括任何 NFS 安装目录。

所以我的问题是双重的:为什么外壳会以这种方式挂起,我该如何阻止它?

答案1

根据我的经验,Linux 上的 NFS 实现不如 Solaris 上的那么健全。特别是 Linux 上的 NFS 可能会导致设备上的进程挂起,因此您可能会看到某些进程处于这种状态:

[pkearns@centos6 ~]$ ps -lp $$
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 D   500  2626  2307  0  80   0 -  1282 -      pts/1    00:00:00 bash
[pkearns@centos6 ~]$ 

第二列中的D表示该进程挂在设备上。设备挂起可以以不可预测的方式在系统中传播,干扰看似不相关的进程。

尝试这个:

ps -elf | awk '$2=="D"'

这将显示设备上挂起的任何进程。

答案2

默认情况下,NFS 使用硬的、不可中断的 FS 调用。因此,您不能“Ctrl+C”或“Ctrl+Z”进行任何 FS 操作(可能是读、写、统计...)。

为了能够“Ctrl+C”,您可以使用选项“挂载 NFS 共享”整数“能够中断系统调用。您可以使用以下命令进行测试: mount -o remount,intr /YOUR/MOUNTPOINT

然后,编辑 /etc/fstab 文件以添加持久性选项。

“nolock”选项只是禁用“文件锁定”方法,用于避免多个客户端并发写入。它与 I/O 无关。

对于“为什么它挂起,而我没有任何对 NFS 位置的引用”的问题,也许有 bashcompletion 的问题,或者确实使用测试 NFS 的命令的脚本?

阿德里安.

答案3

也许在客户端使用“-o nolock”选项可以解决您的问题。

答案4

造成这种情况的原因通常是进程等待 NFS 共享超时(这种情况通常根本不会发生)。在 shell 中,最可能的原因是您的PATH目录之一真正包含可执行文件的那个位于无法访问的 NFS 共享上(正如您所发现的,情况确实如此)

相关内容