我目前正在经历Ubuntu 13.10 中的一个错误这意味着当我在暂停后恢复计算机时,网络连接不会恢复。我有几个 NFS 安装,并且因为它们处于挂起状态,所以每当我尝试在命令行上运行任何内容(例如该错误报告中的解决方法:)时,nmcli cli sleep false
shell 都会挂起。我所说的“挂起”是指它们对任何信号(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 共享上(正如您所发现的,情况确实如此)