我通过 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 挂载选项的原因。