Opracowałem algorytm dla dość trudnego problemu w matematyce, którego ukończenie zajmie prawdopodobnie kilka miesięcy. Ponieważ mam tylko ograniczone zasoby, zacząłem to na moim laptopie z systemem Ubuntu 12.04 (x86). Teraz chcę zainstalować niektóre aktualizacje i zrestartować laptop (komunikat „proszę zrestartować komputer” jest po prostu denerwujący).
Czy istnieje sposób na zapisanie całego procesu, w tym przydzielonej pamięci, w celu kontynuacji po ponownym uruchomieniu?
Oto kilka informacji na temat procesu, który może być potrzebny. W razie potrzeby prosimy o dodatkowe informacje.
./binary > ./somefile &
Wywołałem ten proces w terminalu poleceniem „ ” lub „time ./binary> ./somefile &”, tak naprawdę nie pamiętam.- Drukuje niektóre informacje debugujące do std :: cerr (niezbyt często).
- Obecnie zużywa około 600,0 kiB i chociaż wzrośnie, raczej nie wzrośnie gwałtownie.
- proces przebiega z normalnym priorytetem
- jądro to 3.2.0-26-generic-pae, procesor to AMD, system operacyjny to Ubuntu 12.04 x86.
- działa od 9 dni i 14 godzin (zbyt długo, aby go anulować ;-))
Odpowiedzi:
Najlepszym / najprostszym rozwiązaniem jest zmiana programu w celu zapisania stanu do pliku i ponowne użycie tego pliku w celu przywrócenia procesu.
W oparciu o stronę wikipedii o migawkach aplikacji istnieje wiele alternatyw:
CONFIG_CHECKPOINT_RESTORE
włączone.Jest już za późno, ale kolejnym praktycznym podejściem jest rozpoczęcie procesu na dedykowanej maszynie wirtualnej i zawieszenie i przywrócenie całej maszyny wirtualnej. W zależności od hiperwizora możesz także przenosić maszynę między różnymi hostami.
W przyszłości pomyśl o tym, gdzie uruchamiasz swoje długotrwałe procesy, jak je sparaliżować i jak radzić sobie z problemami, np. Pełne dyski, proces ginie itp.
źródło
Dość „tanim” sposobem na wykonanie tego byłoby przetwarzanie na maszynie wirtualnej (np. Za pomocą VirtualBox). Przed zamknięciem zawiesz maszynę wirtualną i zapisz stan. Po uruchomieniu przywróć VM i stan.
Ma to tę wadę, że wymaga zabicia i ponownego uruchomienia zadania. Ale jeśli faktycznie będzie działał przez kilka miesięcy, to różnica dziewięciu dni stanie się banalna (wzrost o 5% w ciągu 6 miesięcy).
Edycja: Właśnie zdałem sobie sprawę, że Ulrich wspomniał o tym już w nienumerowanym punkcie 4 na swojej liście.
Nadal zachęcam do rozważenia tego jako opcji, zwłaszcza że żadna z alternatyw nie wydaje się solidnym rozwiązaniem. Każdy ma powód, dla którego może nie działać.
Przypuszczam, że najlepszą rzeczą do zrobienia byłoby wypróbowanie jednego z nich, a jeśli to nie zadziała, uruchom ponownie zadanie na maszynie wirtualnej.
źródło
Rzuć okiem na narzędzie CryoPID .
Ze strony głównej: „CryoPID umożliwia przechwycenie stanu uruchomionego procesu w systemie Linux i zapisanie go w pliku. Pliku tego można następnie użyć do wznowienia procesu później, po ponownym uruchomieniu lub nawet na innym komputerze.”
źródło
Jeśli będziesz musiał zrestartować program, zachęcam do poświęcenia trochę czasu na dodanie do kodu pewnych funkcji, które mogą zaoszczędzić czas w przyszłości.
Jeśli proces ma być uruchamiany przez długi czas, możliwość zapisania całego stanu procesu po ponownym uruchomieniu komputera może nie jest bardzo pomocna, jeśli proces ulegnie awarii podczas działania.
Zachęcam cię, aby Twój program wyświetlał dane w postaci pliku „punktu kontrolnego”. Te dane powinny być wystarczające, aby Twój program mógł wznowić pracę od stanu, w jakim był w momencie zapisania pliku punktu kontrolnego. Nie musisz zapisywać całego procesu, wystarczy migawka odpowiednich zmiennych używanych w obliczeniach, wystarczająca do wznowienia obliczeń w miejscu, w którym zostało przerwane. Twój kod musiałby również zawierać sposób odczytu danych z tego pliku, aby uzyskać jego stan początkowy.
Możesz ustawić swój kod, aby po wysłaniu sygnału zapisał jeden z tych plików punktów kontrolnych, aby w dowolnym momencie zapisać „stan” obliczeń.
Dodatkowo możliwość zobaczenia, jak zmieniają się dane w trakcie obliczeń, może sama w sobie być interesująca!
źródło