Можно ли прервать процесс и поставить контрольную точку, чтобы возобновить его позже?

Допустим, у вас есть приложение, которое потребляет всю вычислительную мощность. Теперь вы хотите сделать некоторые другие необходимые работы. Есть ли способ в Linux прервать это приложение и проверить его состояние, чтобы позже его можно было возобновить из состояния, в котором оно было прервано?

Особенно меня интересует способ, при котором приложение можно было бы остановить и перезапустить на другой машине. Это тоже возможно?


person pythonic    schedule 08.05.2012    source источник
comment
Помимо Linux, DragonflyBSD может делать это изначально: dragonflybsd.org/features   -  person kworr    schedule 27.09.2013


Ответы (5)


В общих чертах, создание контрольных точек для процесса не совсем возможно (поскольку процесс представляет собой не только адресное пространство, но и другие ресурсы, такие как файловые дескрипторы и сокеты TCP/IP...).

На практике вы можете использовать некоторые библиотеки контрольных точек, такие как BLCR и т. д. При определенных ограничениях вы можете иметь возможность перенести образ контрольной точки из одной системы в другую (очень похожий на исходный: то же ядро, те же версии библиотек и компиляторов и т. д.).

Перенос изображений также возможен на уровне виртуальной машины. Некоторые из них вполне подходят для этого.

Вы также можете разработать и внедрить свое программное обеспечение с помощью собственного механизма контрольных точек. Затем следует подумать об использовании методов и терминологии сборки мусора. Посмотрите также на Emacs (или Xemacs) unexec.c (который сильно зависит от машины).

Реализация и среда выполнения некоторых языков имеют примитивы контрольных точек. SBCL (бесплатная реализация Common Lisp) может сохраните основной образ и перезапустите его позже. SML/NJ может экспортировать изображение . Squeak (реализация Smalltalk) также имеет такую ​​возможность.

В качестве другого примера контрольных точек компилятор GCC фактически может скомпилировать один заголовок *.h (в предварительно скомпилированный файл заголовка, который является постоянным образом кучи GCC), используя методы сохранения.

Подробнее об ортогональном сохранении. Это тоже предмет исследования. сериализация также актуальна (и вы можете использовать текстовые форматы а-ля JSON, YAML, XML, ...). Вы также можете использовать методы спящего режима (на уровне всей системы).

person Basile Starynkevitch    schedule 08.05.2012

Из справочных страниц man kill

Прерывание процесса требует двух шагов:

Прекратить

kill -STOP <pid>  

и

Продолжать

kill -CONT <pid>

Где <pid> — идентификатор процесса.

person Fredrik Leijon    schedule 08.05.2012

Введите: Control + Z, чтобы приостановить процесс (он отправляет SIGTSTP)

затем bg / fg, чтобы возобновить его в фоновом режиме или на переднем плане

person ouah    schedule 08.05.2012

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

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

person R.. GitHub STOP HELPING ICE    schedule 08.05.2012

В Linux это достижимо, отправив этому процессу сигнал STOP. Письмо о том, что вы возобновите его, отправив сигнал CONT. Пожалуйста, обратитесь к руководству по убийству.

person Michał Cegielski    schedule 08.05.2012
comment
Можно ли перенести этот процесс на другую машину? - person pythonic; 08.05.2012
comment
Не в целом, но см. мой ответ. - person Basile Starynkevitch; 08.05.2012
comment
Этот ответ не является неправильным, так что давай: никаких минусов. Образ процесса с контрольной точкой находится только в памяти (или в выгружаемой памяти) и может быть возобновлен только в сеансе и аппаратном обеспечении, которые его создали, но это частично удовлетворяет требованиям OP. - person masterxilo; 01.12.2016