Я разработал алгоритм для довольно сложной задачи по математике, которая, вероятно, потребуется несколько месяцев, чтобы закончить. Поскольку у меня только ограниченные ресурсы, я начал это на своем ноутбуке Ubuntu 12.04 (x86). Теперь я хочу установить некоторые обновления и фактически перезагрузить ноутбук (сообщение «пожалуйста, перезагрузите» просто раздражает).
Есть ли способ сохранить весь процесс, включая выделенную ему память, для продолжения после перезагрузки?
Вот некоторая информация о процессе, который вам может понадобиться. Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, если это необходимо.
- Я вызвал процесс в терминале с помощью команды "
./binary > ./somefile &
" или "time ./binary> ./somefile &", я не могу вспомнить. - Он выводит некоторую отладочную информацию в std :: cerr (не очень часто).
- В настоящее время он использует примерно 600,0 КБ и, хотя он будет увеличиваться, вряд ли будет быстро расти.
- процесс выполняется с обычным приоритетом
- ядро 3.2.0-26-generic-pae, процессор AMD, операционная система Ubuntu 12.04 x86.
- он работает с 9 дней и 14 часов (слишком долго, чтобы отменить его ;-))
Ответы:
Лучшее / самое простое решение - изменить вашу программу, чтобы сохранить состояние в файл, и повторно использовать этот файл для восстановления процесса.
Основываясь на странице википедии о снимках приложений, существует несколько альтернатив:
CONFIG_CHECKPOINT_RESTORE
включено.Это уже слишком поздно, но еще один практический подход - запустить процесс на выделенной виртуальной машине и просто приостановить и восстановить всю виртуальную машину. В зависимости от вашего гипервизора вы также можете перемещать машину между различными хостами.
В будущем подумайте о том, где вы запускаете свои долго работающие процессы, как их парализовать и как решать проблемы, например, заполнение дисков, уничтожение процессов и т. Д.
источник
Довольно «дешевый» способ сделать это - выполнить обработку на виртуальной машине (например, с помощью VirtualBox). Перед выключением приостановите ВМ и сохраните состояние. После загрузки восстановите ВМ и состояние.
Это имеет тот недостаток, что требует убийства и возобновления работы. Но если он действительно будет работать в течение нескольких месяцев, тогда разница в девять дней станет тривиальной (увеличение на 5% за 6 месяцев).
Редактировать: Я только что понял, что Ульрих уже упоминал об этом в ненумерованном пункте 4 в своем списке.
Я бы все же рекомендовал вам рассмотреть это как вариант, тем более что ни одна из альтернатив не выглядит надежным решением. У каждого есть причина, почему это может не сработать.
Я полагаю, что лучше всего попробовать один из них и, если он не работает, перезапустить работу на виртуальной машине.
источник
Взгляните на инструмент CryoPID .
С домашней страницы: «CryoPID позволяет вам записывать состояние запущенного процесса в Linux и сохранять его в файл. Этот файл затем можно использовать для возобновления процесса позже, после перезагрузки или даже на другом компьютере».
источник
Если вам в конечном итоге потребуется перезапустить программу, я бы посоветовал вам потратить некоторое время на добавление некоторых функций в ваш код, которые могут сэкономить ваше время в будущем.
Если процесс будет выполняться в течение длительного времени, возможность сохранения всего состояния процесса при перезапуске компьютера, возможно, не очень полезна, если ваш процесс завершается сбоем во время работы.
Я бы посоветовал вам выводить вашу программу в файл «контрольная точка» данных. Этих данных должно быть достаточно, чтобы ваша программа могла вернуться из состояния, в котором она была при сохранении файла контрольных точек. Вам не нужно сохранять весь процесс, просто снимок соответствующих переменных, используемых в вашем расчете, достаточный для того, чтобы ваш расчет возобновился с того места, где он остановился. Ваш код также должен включать какой-либо способ чтения данных из этого файла, чтобы получить его начальное состояние.
Вы можете настроить свой код так, чтобы при отправке ему сигнала он сохранял один из этих файлов контрольных точек, чтобы вы могли сохранить «состояние» ваших вычислений в любой точке.
Кроме того, возможность увидеть, как данные изменяются в процессе вычислений, может быть интересна сама по себе!
источник