设备拔出后如何修复正在运行的进程的打开的文件描述符?

设备拔出后如何修复正在运行的进程的打开的文件描述符?

我正在运行一个读取/写入我的 nvme 上的文件的进程/nvmedisk/file

我的 nvme 磁盘由于某种原因出现故障,并且从中消失了,lsblk但被列在了其中lspci

我手动将其重新绑定echo 0000:0b:00.0 > /sys/bus/pci/drivers/nvme/bind

/nvmedisk由于它很忙,我无法卸载lsof

process    80452 gospo  234u   REG              259,1   411951104   84928 /nvmedisk/file

我卸载umount -l /nvmedisk并再次安装了 nvme 磁盘mount /dev/nvme1n2p1 /nvmedisk

磁盘工作正常,但正在运行的进程仍挂起。如果我打开文件,则会/nvmedisk lsof产生磁盘标识符259,9而不是259,1。我该如何修复已打开的文件描述符,以便可以恢复正在运行的进程。

假设该过程使用文件描述符反复重试写入/读取。

答案1

一个可能的解决方案是使用 gdb 创建一个新的文件描述符并用新的替换旧的。

(gdb) p (int)dup2(open("/nvmedisk/file", 1090), 234) // 1090 for O_RDWR | O_CREAT | O_APPEND

相关内容