我通过 ssh 连接到服务器,在该服务器上我试图访问 NFS 目录。但是,由于连接问题,基本命令ls有时(但并非总是)需要永远在此目录中完成。有没有比终止并重新打开 ssh 连接更好的方法来中止此类命令?发送SIGING似乎没有效果。
在内核版本 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)。因此,要么内存中的数据和磁盘上的数据不同步,要么内存映射的数据将不得不在程序背后默默地将自己恢复到预写状态……这两者都不是一个好方法选项,这就是 NFS 挂载选项的原因soft 一般不推荐。