LINUX.ORG.RU

Сохранить процесс на диск

 


1

3

Существует ли способ сохранить на диск состояние отдельного процесса, чтобы выключить машину, а затем снова включить и продолжить с места остановки? Всё, что нашёл поиском в сети, эквивалентно нажатию Ctrl-Z с последующим принудительным заталкиванием памяти процесса в своп. Перезагрузку предложенные способы пережить не позволяют.

Поясню на примере, что нужно. Запущен какой-то длительный вычислительный процесс. Например, архивирование образа виртуальной машины. Через 12 часов выполнено 80%, но тут приходит электрик и требует срочно потушить все электроприборы в связи с ремонтом подстанции и ожидаемыми скачками напряжения. Suspend в системе не настроен, да и не нужен, требуется усыпить всего 1 процесс. Как сохранить промежуточный результат на время выключения?

Как я понял из объяснений, проблема с номерами связанных процессов и открытых файлов и сокетов. Но нельзя ли их перехватывать и подменять? Для простоты пусть процесс один, нет сетевых соединений, только чтение-запись локальных файлов.

P.S. Пожалуйста, не советуйте включить suspend.

★★★

Интересно. Недавно подобная проблема возникла. Я плюнул.

Medar ★★★★★ ()

Поросто настрой suspend (точнее там и настраивать нечего) — это решит все названные тобой проблемы.

beastie ★★★★★ ()
Ответ на: комментарий от Anon

На самом деле не так уж и много. Исходя из 500MB/s — примерно 20-30 секунд. Но ведь пишется то не вся память, а только «грязные» страницы. Т.ч. ещё быстрее.

На самом деле ТС просто ищет приключения на свою пятую точку, отметая с ходу готовый и главное проверенный и рабочий вариант.

Состояние процесса зависит от состояния системы. Заморозить отдельный процесс (опустим всякие лиспы и другие виртуальные машины) в общем случае если и не невозможно, то по крайней мере очень сложно.

Суспенд делает же именно то, что требуется по ТЗ — сохраняет состояние процесса и! окружения (системы).

beastie ★★★★★ ()
Ответ на: комментарий от beastie

500MB/s

Это что за фантастика? На самые дорогие винты максимум 100МБ/с пишется. А уж на домашние попсовые больше 30МБ/с — никак! А даже 300 секунд — это уже пять минут! Не всякий упс столько выдержит. У меня, например, упс на 1 как-бы-киловатт, но за год эксплуатации аккумулятор уже на 70% сдох, т.е. вместо былых 20 минут работы компьютера он от силы 5-7 держит. На работе вообще уже 2 года аккумулятору, так что держит он максимум 30 секунд!

Между тем, пожелания ТСа не столь уж несбыточны: "достаточно всего лишь" написать патчик для ведра, чтобы иметь возможность от рута через ioctl'ы получать адрес памяти конкретного процесса + через ioctl'ы писать в свободную область памяти заранее сохраненный дамп.

Anon ()
Ответ на: комментарий от Anon

Вот чего ты опять шлангуешь?)

У меня в ноуте убогоий винт на 5400 60мб пишет.
А уж если ссд человеческий...

а ТС извращь, да.

dk- ()
Ответ на: комментарий от dk-

У меня в ноуте убогоий винт на 5400 60мб пишет

Ща проверю.

Полтораха WD:

dd if=/dev/zero of=testfile bs=10M count=100
100+0 записей получено
100+0 записей отправлено
 скопировано 1048576000 байт (1.0 GB), 12.3526 c, 84.9 MB/c
Еще одна полторашка (не помню, что):
dd if=/dev/zero of=testfile bs=10M count=100 && rm -f testfile
100+0 записей получено
100+0 записей отправлено
 скопировано 1048576000 байт (1.0 GB), 13.1445 c, 79.8 MB/c
Двушка WD:
dd if=/dev/zero of=testfile bs=10M count=100 && rm -f testfile
100+0 записей получено
100+0 записей отправлено
 скопировано 1048576000 байт (1.0 GB), 14.5329 c, 72.2 MB/c
ССДшка на буке:
dd if=/dev/zero of=testfile bs=10M count=100 && rm -f testfile
^[[15;5~100+0 записей получено
100+0 записей отправлено
 скопировано 1048576000 байт (1.0 GB), 1.55587 c, 674 MB/c
(япона мать! Ну и скорость!)

В общем, я понял откуда я 30 взял: я привык, что при копировании файлов в mc именно такая скорость, но ведь там еще и чтение!

если ссд

тоже об этом придумал. Но дорого. И ненадолго.

Anon ()
Ответ на: комментарий от Anon

Между тем, пожелания ТСа не столь уж несбыточны: «достаточно всего лишь» написать патчик для ведра, чтобы иметь возможность от рута через ioctl'ы получать адрес памяти конкретного процесса + через ioctl'ы писать в свободную область памяти заранее сохраненный дамп.

Не нужен патчик, это уже можно делать: process_vm_readv/writev. А то и проще, обойтись кастомным rtld, загружающим coredump. Сделаешь? :)

const86 ★★★★★ ()
Ответ на: комментарий от const86

загружающим coredump

Если не ошибаюсь, эта тема уже пару раз тут всплывала и пришли к выводу, что проще на Луну слетать, чем всё переделывать. =)

beastie ★★★★★ ()
Ответ на: комментарий от beastie

проще на Луну слетать, чем всё переделывать

На Луну уже слетали, стало быть, пора и переделывать. Я лишь заметил, что для предложенного способа реализации даже в ядре ковыряться не нужно. Другое дело, что сам способ непродуманный, по пути найдётся много препятствий и в итоге выйдет совсем не так просто.

Нечто подобное делает MOSIX, причём уже очень давно. Всякие файлы и сокеты не проблема. Что нельзя переоткрыть — будет ошибаться с EIO, EBADF или ещё как-нибудь, по вкусу.

const86 ★★★★★ ()
Ответ на: комментарий от Anon

У меня, например, упс на 1 как-бы-киловатт, но за год эксплуатации аккумулятор уже на 70% сдох, т.е. вместо былых 20 минут работы компьютера он от силы 5-7 держит. На работе вообще уже 2 года аккумулятору, так что держит он максимум 30 секунд!

Что-то твои аккумуляторы совсем говно. Нормальный аккумулятор теряет 10-20% номинальной емкости в год.

ansky ★★★★★ ()

Поросто настрой suspend (точнее там и настраивать нечего) — это решит все названные тобой проблемы.

beastie, если ты считаешь, что гарантированно можно настроить suspend на любой работающей машине без единой перезагрузки, предлагаю в воскресенье помочь мне наладить его под Ubuntu на старом EEE PC 700. Маленький основной диск без своп-раздела, на 32-гигабайтной флешке что-то медлено архивируется; проверяем всё, что можно, настраиваем, усыпляем, будим. Если проснулось успешно, проверяем целостность архива.

Хотел предложить в случае неудачи удалить твой пост со снятием скора, но передумал.

olegd ★★★ ()
Ответ на: комментарий от olegd

Незачем так огрызаться. В твоём ТЗ о твоих проблемах нет ни слова. Я тебе просто предложил самый простой и очевидный вариант решения и за руки тебя не тяну.

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

Все другие решения, как ты сам видишь или не существуют или слишком сложны или ненадёжны и их можно в лучшем случае определить в область «пре-альфа». Так какие у тебя ко мне претензии?

beastie ★★★★★ ()
Ответ на: комментарий от beastie

UPD: если у тебя есть доступ к «железу» и нет места на диске, то своп можно добавить и на дополнительную флешку. Будет не быстро, но хоть как-то.

beastie ★★★★★ ()
Ответ на: комментарий от beastie

Так какие у тебя ко мне претензии?

Если бы был доступен саспенд, я бы им воспользовался. А ты замусориваешь тему, повторяя очевидные вещи. Да, саспенд лучше. Но он недоступен.

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

olegd ★★★ ()
Ответ на: комментарий от aedeph_

Я обычно оставляю на «а вдруг!». Как раз в таких случаях может пригодиться.

beastie ★★★★★ ()
Ответ на: комментарий от olegd

Где я говорил, что я особый специалист? Я просто указал на возможное решение. К тому же я «бздун» и в убунте к сожалению не слишком силён.

Если тебе конечно от этого станет легче, я могу убить своё сообщение с -20 (жалко только Anon и других, которые тоже от этого пострадают), но так мы хотя бы выяснили, что свопа у тебя нет и у тебя появился дополнительный вектор поиска решения проблемы.

Т.ч. нечего свою обиду срывать на мне.

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1 )
Ответ на: комментарий от olegd

Вроде же можно в файл свопиться.

http://ubuntuforums.org/showthread.php?t=1042946

Но я честно признаться не знаю, как оно всё будет. У тебя есть возможность проверить на некритичной машине?

UPD: вообще-то я даже не уверен, будет ли hibernate работать не со своп-партицией, а своп-файлом.

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1 )
Ответ на: комментарий от beastie

Если тебе конечно от этого станет легче, я могу убить своё сообщение с -20 (жалко только Anon и других, которые тоже от этого пострадают),

Поэтому и передумал.

http://ubuntuforums.org/showthread.php?t=1042946

Attention: If you have swap partition and hibernation does not work, STOP HERE. First fix hibernation (seek help elsewhere, try «sudo apt-get install hibernation») before proceeding.

Сейчас покопался в своих тогдашних записях (память плохая), там дело было хуже. Своп-раздел всё-таки был, но после очередного обновления гибернация стала регулярно отказывать. Возможно, просто стало не хватать места на своп-разделе, но увеличивать его было некуда — диск маленький. Причину я не установил.

То есть перед экспериментами со свопом в файл желательно понять, в чём проблема.

olegd ★★★ ()
Ответ на: комментарий от const86

Сделаешь?

Некогда.

Ну, coredump-то ты сохранишь, а есть ли механизм загрузки? Что-то лень мне про этот rtld читать. Подозреваю, что можно из промежуточного процесса этим rtld загрузить coredump, как динамическую библиотеку, а потом сделать fork и передать управление туда. ХЗ.

Anon ()
Ответ на: комментарий от Anon

43тб записано. 43тб прочитано.

за 18 месяцев. для 120гб ссд.

dk- ()
Ответ на: комментарий от slackwarrior

core dump. No, srsly.

А восстановить как? Готовым скриптом не поделишься?

olegd ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.