Смена диска, используемого долгим процессом
Предположим, у меня есть процесс, который выполняет длинные вычисления (например, он работает в течение нескольких дней), он использует диск в качестве временного хранилища для хранения промежуточных результатов (например, смонтированный в /mnt
и я хочу заменить /dev/sda1
от /dev/sdb1
). Как я могу заменить этот диск на другой, не прерывая этот процесс и не нарушая его слишком сильно?
Это общий вопрос, я не думаю о конкретной программе. Допустим, мы запускаем последнюю версию Linux.
3 ответа
Если процесс использует какой-то каталог для создания и удаления временных файлов, вы можете попытаться остановить его с помощью kill -STOP $pid
и посмотрите в /proc/$pid/fd дескрипторы открытых файлов.
Если ничего не открыто, вы можете смело менять место монтирования, копировать его файлы и продолжать работу с kill -CONT $pid
,
Если все еще есть открытые файлы или процесс не закрывает файлы, вы можете попробовать перенести файловые дескрипторы с помощью GDB. Я попробовал это вручную, и это сработало, но я нашел сценарий, который может сделать это для вас: http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/
Будьте осторожны, если процесс обменивается данными по сети, когда вы останавливаете его, соединения могут прерваться, поэтому вам нужно сделать это как можно быстрее (возможно, предварительно проверьте последовательность команд на пустом процессе и запустите его как пакетный)
Хотя я думаю, что это сработает, я не буду рекомендовать вам делать это в производственной среде.
РЕДАКТИРОВАТЬ: Вы можете увидеть открытые сетевые сокеты в /proc/$pid/fd, чтобы вы могли определить, использует ли процесс сеть или нет.
Это полностью зависит от поведения вашего процесса при использовании его временного хранилища.
Если ваш процесс содержит открытый файл /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
не может быть открыт! - Умри ужасно
Любая программа, выполняющая вычисления в течение нескольких дней, должна быть рассчитана на периодическое сохранение достаточного состояния на диске. Если перезапуск процесса означает, что вы теряете час времени обработки, это может быть хорошо, но если вы потеряете больше, я бы назвал эту программу плохо спроектированной.
Тем не менее, могут быть и другие сценарии, в которых вы хотите поддерживать процесс дольше и иметь возможность заменить диск из-под него. В таких ситуациях вам следует изучить возможность отделения файловой системы от физического носителя.
Возможные варианты включают в себя:
- Использовать программный рейд
- Используйте другой уровень виртуальных блочных устройств (возможно, подходит LVM)
- Используйте файловую систему, которая сама может использовать несколько базовых устройств