Linux'ta bir işlemi belleğini diske kaydedip daha sonra geri yükleyerek "hazırda bekletme" nasıl yapılır?


99

Linux'ta bir işlemi 'hazırda bekletmek' mümkün mü? Tıpkı dizüstü bilgisayardaki 'hazırda bekletme' gibi, bir işlem tarafından kullanılan tüm belleği diske yazmak, RAM'i boşaltmak isterdim. Daha sonra 'işleme devam edebilirim', yani hafızadaki tüm verileri okuyup RAM'e geri koyabilirim ve işlemime devam edebilir miyim?


8
İlginç soru: D
dangerstat

Tanımladığınız şey aslında genellikle 'kontrol noktası' olarak adlandırılır, bu terimle arama yaparken daha iyi şansınız olabilir.
Tim Post

İyi bir özellik olmalı. Hazırda bekletme vs.
Vitali Fadeev

Yanıtlar:


54

Ben korumak için kullanılan CryoPID bahsediyorsun tam olarak ne yapar bir programdır. Bir programın adres alanının, VDSO'nun, dosya tanımlayıcı referanslarının ve durumların içeriğini daha sonra yeniden yapılandırılabilecek bir dosyaya yazar. CryoPID, Linux'ta kullanılabilir kancalar olmadığında başladı ve tamamen kullanıcı alanından çalıştı (aslında, dağıtım / çekirdek / güvenlik ayarlarınıza bağlı olarak hala çalışıyor).

Sorunlar (aslında) soketler, bekleyen RT sinyalleri, sayısız X11 sorunu, glibc önbelleğe alma getpid () uygulaması ve diğerleri. Rastgeleleştirme (özellikle VDSO), Bernard oradan uzaklaştıktan sonra üzerinde çalışan birkaçımız için aşılmaz olduğu ortaya çıktı. Ancak, eğlenceliydi ve birçok yüksek lisans tezinin konusu oldu.

Eğer sadece çalışma durumunu kaydedebilen ve doğrudan o duruma yeniden başlayabilen bir programı tasarlıyorsanız, çok .. çok .. bu bilgiyi programın içinden kaydetmek, belki bir sinyale hizmet verirken daha kolaydır.


5
Ne yazık ki Temmuz 2014 itibariyle CryoPID artık korunmuyor ve yeni çekirdeklerde çalışmıyor. Ancak bu arada yeni projeler doğar (TCP bağlantısı "hazırda bekletme" durumunda bile bazı adımlar atılmıştır). Aşağıda güncellenmiş bilgilerle bir cevap verdim . Bunu kontrol et! ;)
dappiu

1
@dappiu Bu harika - ancak CryoPID, programın kendi içinde durumu kolayca devam ettirilebilecek bir şekilde kurtarmayı önerdiğim yerde ne kadar zor olabileceğini göstermek için bu yanıtta sadece bir örnekti . CryoPID'de durgunluk, cevabı daha az alakalı hale getirmez.
Tim Post

Cryopid2 daha yakın zamanda aktif (2013): sourceforge.net/projects/cryopid2
Leopd

31

2014 itibariyle buraya bir durum güncellemesi eklemek istiyorum.

Kabul edilen cevap, CryoPID'yi Kontrol Noktası / Geri Yükleme'yi gerçekleştirmek için bir araç olarak öneriyor, ancak projenin beklenmedik ve son çekirdeklerle derlenmesi imkansız olduğunu gördüm. Şimdi, uygulama kontrol noktası özelliği sağlayan aktif olarak yürütülen iki proje buldum.

Birincisi, benim önerdiğim, çünkü onu çalıştırma şansım daha yüksek , kontrol noktası / geri yükleme esas olarak kullanıcı alanında gerçekleştiren ve çalışmak için CONFIG_CHECKPOINT_RESTORE çekirdek seçeneğinin etkinleştirilmesini gerektiren CRIU .

Checkpoint / Restore In Userspace veya CRIU (kree-oo olarak okunur, IPA: / krɪʊ /, Rusça: криу), Linux işletim sistemi için bir yazılım aracıdır. Bu aracı kullanarak, çalışan bir uygulamayı (veya bir kısmını) dondurabilir ve bir dosya koleksiyonu olarak bir sabit sürücüye işaretleyebilirsiniz. Daha sonra, uygulamayı donmuş olduğu noktadan geri yüklemek ve çalıştırmak için dosyaları kullanabilirsiniz. CRIU projesinin ayırt edici özelliği, esas olarak kullanıcı alanında uygulanmasıdır.

İkincisi DMTCP'dir ; ana sayfalarından alıntı yaparak:

DMTCP (Dağıtılmış Çok İş Parçacıklı Kontrol İşaretleme), çok iş parçacıklı ve dağıtılmış uygulamalar dahil olmak üzere birden çok eşzamanlı uygulamanın durumunu şeffaf bir şekilde kontrol etmek için kullanılan bir araçtır. Herhangi bir Linux çekirdek modülü veya diğer çekirdek modifikasyonları olmadan doğrudan kullanıcı ikili yürütülebilir dosyası üzerinde çalışır.

Argümanda güzel bir Wikipedia sayfası da var: Application_checkpointing


21

Bahsedilen cevaplar ctrl-z, bu durumda, süreci bir sinyal ile durdurmaktan bahsediyor SIGTSTP. Aşağıdakilerle bir durdurma sinyali verebilirsiniz kill:

kill -STOP <pid>

Bu, sürecin yürütülmesini askıya alacaktır. Kullandığı belleği hemen boşaltmaz, ancak diğer işlemler için bellek gerektiğinden, durdurulan işlem tarafından kullanılan bellek yavaş yavaş yer değiştirir.

Tekrar uyandırmak istediğinizde kullanın

kill -CONT <pid>

CryoPID gibi daha karmaşık çözümlere gerçekten sadece durdurulmuş işlemin bir sistem kapanma / yeniden başlatma işleminden kurtulmasını istiyorsanız gereklidir - buna ihtiyacınız varmış gibi gelmiyor.


14

Sorun, programın açtığı dosyaları ve soketleri geri yüklemektir.

Tüm işletim sisteminiz hazırda bekletildiğinde, yerel dosyalar ve benzeri açık bir şekilde geri yüklenebilir. Ağ bağlantıları yoktur, ancak internete erişen kod genellikle daha fazla hata kontrolüdür ve bu tür ve hata koşullarından kurtulur (veya olmalıdır).

Her program için hazırda bekletme yaptıysanız (uygulama desteği olmadan), açık dosyaları nasıl işlerdiniz? Ya bu arada başka bir süreç bu dosyalara erişirse? vb?

Program yüklenmediğinde durumu korumak zor olacak.

Basitçe iş parçacıklarını askıya almak ve diske değiştirilmesine izin vermek aynı etkiye sahip mi?

Veya programı sanal bir makinede çalıştırın ve sanal makinenin askıya alma işlemini gerçekleştirmesine izin verin.



12

Kısa cevap "evet, ancak her zaman güvenilir değil" dir. CryoPID'ye bakın:

http://cryopid.berlios.de/

Açık dosyalar gerçekten en yaygın sorun olacaktır. CryoPID açıkça belirtir:

Açık dosyalar ve ofsetler geri yüklenir. Bağlantısı kaldırılan ve dosya sisteminde erişilemeyen geçici dosyalar her zaman görüntüye kaydedilir. Özgeçmişte mevcut olmayan diğer dosyalar henüz geri yüklenmedi. Bu tür durumlar için dosya içeriklerini kaydetme desteği planlanmıştır.

CryoPID, bağlantıyı sürdürmek için tcpcp'yi desteklese de, aynı sorunlar TCP bağlantılarını da etkileyecektir.


3
Gönder düğmesine bastıktan sonra, bunun CryoPID için spam / reklama çok benzediğini şimdi anlıyorum. Öyle değil - Ben gerçekten yardımcı programın memnun bir kullanıcısıyım.
Ulisses Karadağ


6

Cryopid'i SourceForge'dan temin edilebilen Cryopid2 adlı bir paket üreterek genişlettim. Bu, bir süreci geçirebilir ve aynı zamanda onu hazırda bekletebilir (açık dosyalar ve soketlerle birlikte - soketlerdeki / kanallardaki veriler hazırda bekletme sırasında işleme emilir ve işlem yeniden başlatıldığında bunlara geri döner).

Bu projede aktif olmamamın nedeni çekirdek geliştirici olmamamdır - hem bu (ve / veya orijinal kriyopid) onları en son çekirdeklerle çalıştıracak birini (örneğin Linux 3.x) gemiye almalı. .

Cryopid yöntemi işe yarıyor - ve muhtemelen karşılaştığım Linux'ta genel amaçlı işlem hazırda bekletme / geçiş için en iyi çözüm.


3

Diğerlerinin de belirttiği gibi, işletim sisteminin bu işlevi sağlaması zordur, çünkü uygulamanın bozuk akışları işlemek için bazı hata denetimi yerleşiklerine sahip olması gerekir.

Bununla birlikte, bir yan notta, sanal makineleri kullanan bazı programlama dilleri ve araçları, Kendi kendine programlama dili gibi bu işlevi açıkça destekler .


0

Ctrl-Z, işlem sayfalarının değiştirilme şansını artırır, ancak işlemin kaynaklarını tamamen serbest bırakmaz. Bir sürecin kaynaklarını tamamen serbest bırakmanın sorunu, dosya tanıtıcıları, soketler gibi şeylerin sürecin kullanacağı çekirdek kaynakları olması, ancak kendi kendine nasıl devam edeceğini bilmemesidir. Yani Ctrl-Z olabileceği kadar iyidir.


0

Linux için kontrol noktası / geri yükleme üzerine 2.2 ve 2.4 günlerinde bazı araştırmalar yapıldı, ancak hiçbir zaman prototipi geçemedi. Mümkün olan belirli değerler için (diğer cevaplarda açıklanan uyarılarla) mümkündür - bunu yapmak için bir çekirdek modülü yazabilirim, mümkün. Ama mümkün olanın ortak değeri için (bunu ticari bir Linux dağıtımında kabuktan yapabilir miyim), henüz mümkün değil.


0

Bu, kümelenmiş işletim sisteminin nihai amacıdır. Mathew Dillon, Dragonfly BSD projesinde buna benzer bir şey uygulamak için çok çaba sarf ediyor .


Bu özellik Dragonfly BSD'de tam olarak uygulanıyor mu?
Arjun J Rao

0

başka bir geçici çözüm eklemek: sanal kutuyu kullanabilirsiniz. uygulamalarınızı normal bir sanal makinede çalıştırın ve istediğiniz zaman basitçe "makine durumunu kaydedin". Bunun bir cevap olmadığını biliyorum, ancak gerçek seçenek olmadığında yararlı olabileceğini düşündüm.

eğer herhangi bir nedenle sanal kutuyu sevmiyorsanız, vmware ve Qemu o kadar iyidir.


-2

Orada ctrl+zemin belirttiğiniz özellikler sunmaktadır linux, ama ben değilim. Sanırım bu soruyu sormadığından

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.