Kdysi jsem udržoval CryoPID, což je program, který dělá přesně to, o čem mluvíte. Zapisuje obsah adresového prostoru programu, VDSO, odkazy na deskriptory souboru a stavy do souboru, který lze později rekonstruovat. CryoPID začalo, když v samotném Linuxu nebyly žádné použitelné háčky a fungovalo výhradně z uživatelského prostoru (ve skutečnosti stále funguje, v závislosti na vašem distribuci / jádru / nastavení zabezpečení).
Problémy byly (ve skutečnosti) sockety, nevyřízené signály RT, četné problémy X11, implementace getpid() pro ukládání do mezipaměti glibc a mnoho dalších. Randomizace (zejména VDSO) se ukázala jako nepřekonatelná pro pár z nás, kteří na ní pracovali poté, co ji Bernard opustil. Bylo to však zábavné a stalo se tématem několika diplomových prací.
Pokud právě uvažujete o programu, který může uložit svůj běžící stav a restartovat se přímo do tohoto stavu, je mnohem .. mnohem .. snazší uložit tyto informace ze samotného programu, možná při obsluze signálu.
Rád bych sem umístil aktualizaci stavu od roku 2014.
Přijatá odpověď navrhuje CryoPID jako nástroj pro provádění Checkpoint/Restore, ale zjistil jsem, že projekt je neudržovaný a nelze jej zkompilovat s nedávnými jádry. Nyní jsem našel dva aktivně spravované projekty poskytující funkci kontrolního bodu aplikace.
První, ten, který navrhuji, protože mám větší štěstí při jeho spuštění, je CRIU, který provádí kontrolní bod/obnovu hlavně v uživatelském prostoru a vyžaduje, aby fungovala možnost jádra CONFIG_CHECKPOINT_RESTORE.
Checkpoint/Restore In Userspace, neboli CRIU (vyslov kree-oo, IPA:/krɪʊ/, rusky:криу), je softwarový nástroj pro operační systém Linux. Pomocí tohoto nástroje můžete zmrazit spuštěnou aplikaci (nebo její část) a zkontrolovat ji na pevném disku jako kolekci souborů. Soubory pak můžete použít k obnovení a spuštění aplikace od bodu, ve kterém byla zmrazena. Charakteristickým rysem projektu CRIU je, že je implementován především v uživatelském prostoru.
Ten druhý je DMTCP; cituji z jejich hlavní stránky:
DMTCP (Distributed MultiThreaded Checkpointing) je nástroj pro transparentní kontrolu stavu více simultánních aplikací, včetně vícevláknových a distribuovaných aplikací. Funguje přímo na uživatelském binárním spustitelném souboru, bez jakýchkoli modulů jádra Linuxu nebo jiných úprav jádra.
Na argumentu je také pěkná stránka Wikipedie:Application_checkpointing
Odpovědi zmiňující ctrl-z
skutečně mluví o zastavení procesu signálem, v tomto případě SIGTSTP
. Signál k zastavení můžete vydat pomocí kill
:
kill -STOP <pid>
To pozastaví provádění procesu. Okamžitě neuvolní paměť, kterou používá, ale protože paměť je vyžadována pro jiné procesy, paměť používaná zastaveným procesem bude postupně vyměněna.
Až jej budete chtít znovu probudit, použijte
kill -CONT <pid>
Složitější řešení, jako je CryoPID, jsou skutečně potřeba pouze v případě, že chcete, aby zastavený proces přežil vypnutí/restart systému – nezní to, jako byste to potřebovali.