CryoPID – Zamrażanie pojedynczych procesów
Napisał: Patryk Krawaczyński
04/07/2009 w Debug Brak komentarzy. (artykuł nr 88, ilość słów: 529)
W
iększość z nas jest zaznajomiona z możliwościami typowego laptopa pod względem hibernacji. W tym trybie cała zawartość pamięci RAM zostaje zapisana na dysk naszej maszyny, a ona sama wyłączana. Przy ponownym uruchomieniu system jest odtwarzany dokładnie do tego samego stanu, przed którym został uśpiony, z wszystkimi programami, które były uruchomiony w taki sposób w jaki działały dotychczas.
A, co jeśli byśmy posiadali taką możliwość na poziomie pojedynczych procesów? Byśmy mogli zamrozić dowolny proces / aplikację, która jest odpalona na naszym komputerze oraz zrobić jej kopię w dowolnym momencie jej działania oraz przywrócić ją nawet po ponownym uruchomieniu systemu do dokładnie takiego samego stanu, w jakim została zamrożona.
Istnieje mały program dla Linuksa umożliwiający taki zabieg – nazywa się CryoPID. Nie potrzebuje on żadnych modyfikacji ze strony jądra systemu w dodatku działa z powodzeniem w trybie zwykłego użytkownika, tak więc nie musimy posiadać praw administratora by zamrażać procesy. Wystarczy odpalić program na procesie, którego jesteśmy właścicielem. Oczywiście zaczniemy od kompilacji samego programu:
tar -zxvf cryopid.tar.gz cd cryopid/src/ make cd .. testers/ make
By zademonstrować jego działanie, wystarczy z katalogu testers/ w jednej konsoli odpalić programik o nazwie mypids – podający, co jakiś czas identyfikator swojego procesu. W drugiej konsoli odpalić sam programik freeze ze składnią, na końcu której będzie wcześniej wspomniany PID programu mypids:
freeze /tmp/zamrozony_mypids 3535
Po czym powinniśmy otrzymać komunikat podobny do tego:
[+] Terminal device appears to be 136:3 Map: 08048000-08049000 r-xp 00000000 03:02 2331341 /root/testers/mypidis Map: 08049000-0804a000 rw-p 00000000 03:02 2331341 /root/testers/mypidis Map: b7dbb000-b7dbc000 rw-p b7dbb000 00:00 0 (null) [+] Found scribble zone: 0xb7dbb000 Map: b7dbc000-b7f02000 r-xp 00000000 03:02 1362614 /lib/libc-2.7.so [+] Found a syscall location at 0xb7ddbf7a Map: b7f02000-b7f03000 r--p 00146000 03:02 1362614 /lib/libc-2.7.so Map: b7f03000-b7f05000 rw-p 00147000 03:02 1362614 /lib/libc-2.7.so Map: b7f05000-b7f09000 rw-p b7f05000 00:00 0 (null) Map: b7f16000-b7f17000 rw-p b7f16000 00:00 0 (null) Map: b7f17000-b7f33000 r-xp 00000000 03:02 1363807 /lib/ld-2.7.so Map: b7f33000-b7f35000 rw-p 0001b000 03:02 1363807 /lib/ld-2.7.so Map: bfaac000-bfac1000 rw-p bffeb000 00:00 0 [stack] Ignoring map - vsyscall page. Error parsing map: ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso] Saved console chunk (0). Saved console chunk (1). Saved console chunk (2). [+] Process is probably in syscall. Returning EINTR. Heap was at 0x12b00. Want to be at 0xb7dbb000. offset = 0xb7da8500 Compressed 138751 bytes into 10940 bytes (93% compression) Written image.
Co powinno skutkować zapisaniem stanu procesu 3535 do samo rozpakowującego, skompresowanego pliku o nazwie /tmp/zamrozony_mypids. Teraz możemy z powodzeniem wykonać ponowny rozruch systemu, a następnie odtworzyć nasz zamrożony proces poprzez jego zwyczajne odpalenie:
$ /tmp/zamrozony_mypids
Po wydaniu tej komendy nasz proces zostanie odtworzony, dolinkowany do poprzednio załadowanych bibliotek oraz przypisany odpowiednim deskryptorom plików, które otworzył. Podczas pracy z różnymi aplikacjami sieciowymi oraz tymi pracującymi pod systemem X, możemy napotkać na błędy w otwieraniu poprzednich soketów połączeń. Dlatego należy podchodzić do programu, który jest jeszcze w fazie eksperymentalnej z pewnym dystansem, ale rozwiązanie to wydaje się obiecującym scenariuszem w świecie programów konsolowych.
Więcej informacji: CryoPID