假设我有一个进行长时间计算的进程(例如,它已经运行了几天),它使用一个磁盘作为临时存储来存储中间结果(例如挂载在/mnt
,我想用/dev/sdb1
replace/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得不好。
也就是说,可能还有其他一些情况,您希望让进程保持更长时间,并且能够从其下取代磁盘。 对于这些情况,您应该考虑将文件系统与物理介质分离。
可能的选项包括: