更改长时间运行的进程所使用的磁盘

假设我有一个进行长时间计算的进程(例如,它已经运行了几天),它使用一个磁盘作为临时存储来存储中间结果(例如挂载在/mnt ,我想用/dev/sdb1replace/dev/sda1 )。 我怎样才能用另一个磁盘来replace这个磁盘而不会造成这个过程的干扰,而且不会造成太多的干扰

这是一个普遍的问题,我没有想到一个特定的程序。 假设我们运行最新版本的linux

如果进程正在使用某个目录来创build和删除临时文件,则可以尝试使用kill -STOP $pid命令来停止它,并查看/ proc / $ pid / fd以打开文件描述符。

如果没有打开,则可以安全地更改安装位置,复制它的文件并继续使用kill -CONT $pid

如果仍然有一些打开或进程不closures文件,您可以尝试使用GDB迁移文件描述符。 我尝试过,手工,它的工作,但我find了一些脚本,可以为你做到这一点: http : //ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor -on即时/

如果进程通过networking进行通信,当您停止进程时,请小心,连接可能会超时,因此您需要尽快完成(可能在虚拟进程之前testing命令序列,然后以批处理方式运行)

虽然我认为这将起作用,但我宁愿不build议您在生产环境中使用。

编辑:你可以在/ proc / $ pid / fd中看到打开的networking套接字,所以你可以确定进程是否使用networking。

这完全取决于您的stream程在使用临时存储时的行为。

如果您的进程在/mnt上保留了一个打开的文件,那么即使您设法强制卸载该设备,也不能在不导致进程最可能以某种未定义的方式失败的情况下replace该设备。 进程通常不希望他们打开文件的设备消失。

如果您的进程打开,写入,然后closures/mnt上的文件,您可能能够避开它,卸载并重新安装/mnt ,然后重新启动它。 这取决于你在不使用/mnt时能够停止进程。 所以你可以

 $ kill -STOP pid $ lsof -p pid | grep /mnt ... then, if it has nothing open on /mnt ... $ sudo umount /mnt $ sudo mount /dev/sdb1 /mnt $ kill -CONT pid 

即使您在/mnt上没有打开文件的情况下停止进程,这也不一定有效,因为您可能已经中断了某些依赖/mnt不变的逻辑; 就像是

  • 检查/mnt/wibble存在
  • 它呢! 让我们准备好打开并阅读它
  • …进程停止,并将另一个设备挂载到/mnt
  • 进程重新启动…
  • 不好了! /mnt/wibble无法打开!
  • 死得可怕

任何进行数天计算的程序都应该被devise为定期向磁盘提交足够的状态。 如果重新启动进程意味着你失去了一个小时的处理时间,这可能是好的,但如果你失去了更多,我会打电话给那个程序devise得不好。

也就是说,可能还有其他一些情况,您希望让进程保持更长时间,并且能够从其下取代磁盘。 对于这些情况,您应该考虑将文件系统与物理介质分离。

可能的选项包括:

  1. 使用软件RAID
  2. 使用其他虚拟块设备层(也许LVM是合适的)
  3. 使用一个文件系统,它本身可以使用多个底层设备