中止缓慢的 NFS 操作

中止缓慢的 NFS 操作

我通过 ssh 连接到服务器,在该服务器上我尝试访问 NFS 目录。但是,由于连接问题,基本命令有时ls(但并非总是)需要永远在此目录中完成。有没有比终止并重新打开 ssh 连接更好的方法来中止此类命令?发送SIGING好像没有效果。

答案1

在内核版本 2.6.25 之后,停止挂在无法访问的 NFS 挂载上的进程的唯一方法是 SIGKILL,即kill -9

在该内核版本之前,它曾经依赖于使用的挂载选项:使用选项,hard,nointr进程将是不可中断的,并且hard,intr可以使用 SIGINT 中断 NFS 挂起的进程。

在内核 2.6.25 中,人们认识到完全不可杀死的进程通常是非常不受欢迎的,因此整个intr/nointr挂载选项对被设置为不可操作,并intr成为标准操作模式。同时,信号要求被收紧为SIGKILL,以表明只有在仔细考虑后才能终止处于这种状态的进程。

本质上只读的进程(例如ls应该始终可以安全地杀死),但如果该进程正在向位于 NFS 文件系统中的文件写入内容,则挂在无法访问的 NFS 服务器上,并且您杀死它,则目标文件可能处于不连贯的状态之后状态,可能需要一些特定于应用程序的恢复操作。

使用 options soft,timeo=<number of deciseconds>,操作将在指定时间过后自动失败并出现错误,但这有可能导致数据完整性问题。例如,如果程序正在访问具有可写功能的基于 NFS 的文件 mmap(2),并且写入操作失败,则无法将错误报告回程序,甚至也没有确定的方法来阻止程序继续,除非/直到程序调用munmap(2)msync(2)。因此,要么内存中的数据和磁盘上的数据不同步,要么内存映射的数据必须在程序背后默默地恢复到预写入状态......两者都不其中是一个不错的选择,并且soft这就是为什么通常不推荐使用NFS 挂载选项的原因。

相关内容