Изменить диск, используемый длительным процессом

Изменить диск, используемый длительным процессом

Предположим, у меня есть процесс, который выполняет длительные вычисления (например, он работает несколько дней), он использует диск в качестве временного хранилища для хранения промежуточных результатов (например, смонтированный в /mntи я хочу заменить /dev/sda1на /dev/sdb1). Как я могу заменить этот диск другим диском, не убивая этот процесс и не мешая ему слишком сильно?

Это общий вопрос, я не думаю, что это относится к конкретной программе. Допустим, мы запускаем последнюю версию Linux.

решение1

Если процесс использует какой-либо каталог для создания и удаления временных файлов, вы, вероятно, можете попробовать остановить его с помощью kill -STOP $pidкоманды и посмотреть в /proc/$pid/fd открытые файловые дескрипторы.

Если ничего не открыто, вы можете смело изменить место монтирования, скопировать его файлы и продолжить работу с kill -CONT $pid.

Если все еще есть открытые или не закрывающиеся файлы, вы можете попробовать перенести дескрипторы файлов с помощью GDB. Я пробовал это вручную, и это сработало, но я нашел скрипт, который может сделать это за вас:http://ingvar.blog.redpill-linpro.com/2010/07/10/изменение-дескриптора-файла-процесса-на-лету/

Будьте осторожны, если процесс взаимодействует по сети. При его остановке может произойти тайм-аут соединения, поэтому вам нужно сделать это как можно быстрее (возможно, предварительно протестируйте последовательность команд на фиктивном процессе и запустите его в пакетном режиме).

Хотя я думаю, что это сработает, я лучше сделаю это.не рекомендуювам сделать это в производственной среде.

EDIT: Вы также можете увидеть открытые сетевые сокеты в /proc/$pid/fd, чтобы определить, использует ли процесс сеть или нет.

решение2

Это полностью зависит от поведения вашего процесса при использовании временного хранилища.

Если ваш процесс держит файл открытым на /mnt, то вы не можете заменить устройство, не вызвав, скорее всего, сбой процесса каким-то неопределенным образом, даже если вам удастся принудительно размонтировать устройство. Процессы, как правило, не ожидают, что устройства, на которых у них есть открытые файлы, исчезнут.

Если ваш процесс открывает, записывает и затем закрывает файлы на /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Не открывается!
  • Умереть ужасно

решение3

Любая программа, выполняющая вычисления, которые длятся днями, должна быть спроектирована так, чтобы периодически передавать достаточное количество состояния на диск. Если перезапуск процесса означает, что вы теряете час времени обработки, это может быть нормально, но если вы теряете больше, я бы назвал такую ​​программу плохо спроектированной.

Тем не менее, могут быть и другие сценарии, когда вы хотите сохранить процесс живым дольше и иметь возможность заменить диск из-под него. В таких ситуациях вам следует рассмотреть возможность отделения файловой системы от физического носителя.

Возможные варианты включают в себя:

  1. Использовать программный рейд
  2. Используйте другой уровень виртуального блочного устройства (возможно, подойдет LVM)
  3. Использовать файловую систему, которая сама по себе может использовать несколько базовых устройств.

Связанный контент