Linux sistemlerinde çalışan bir işlemi duraklatmanın ve daha sonra devam etmenin bir yolu var mı?


37

Dosyaları bir makineye kopyalamalıyım. Ve veriler son derece büyük. Artık sunucuların normal şekilde hizmet vermesi gerekiyor ve bunlar üzerinde belirli bir yoğun saat aralığı var. Öyleyse, böyle komutları çalıştırmanın bir yolu var mı, eğer sunucu yoğun saatlere ulaşırsa, işlemi duraklatır ve bu aralıktan çıktığında, devam eder mi?

Amaçlanan-Sonucu

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync kısmi transferlere devam edebilir
Thorbjørn Ravn Andersen

2
Eğer Do ihtiyaç yedek olarak kopyalanacak gerçek verileri? Değilse, cp -albir hardlink çiftliği yapmak için kullanabilir misiniz? Ya da, yazma üzerine kopyala ile blok düzeyinde düzeltmeleri destekleyen bir dosya sistemi kullanmak cp -a --reflink=auto? BTRFS ve ZFS, aynı fiziksel aygıttaki kopyalar için bunu destekler.
Peter Cordes

9
src9:00 ile 14:00 arasında değişen dosyalardan biri değişiyor mu? Öyleyse, cpişlemi duraklatmak ve devam ettirmek, bozuk dosyalara neden olabilir. rsyncKomutla birlikte çalıştırmak daha iyi olabilir timeout.
Mark Plotnick

Dosyalar nereden ve nereye kopyalanıyor? Bu sanal bir sistem mi? Kaynak dosya sistemi nedir? Kopyanın amacı nedir?
Braiam

@Braiam Im rsync kullanarak ve uzaktaki yerel makineye dosya kopyalama. Sadece burada örnek olarak cp komutunu kullandım btw
Sollosa

Yanıtlar:


7

Evet, ihtiyacınız

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

İşlem daha sonra "T" Durumunda (PS) görünecektir. Devam etmek

$> kill -CONT <pid>

İyi şanslar!


77

Bir SIGSTOP sinyali göndererek bir işlemin yürütülmesini duraklatabilir ve daha sonra SIGCONT göndererek devam ettirebilirsiniz.

İş yükünüzün tek bir işlem olduğunu varsayarak (arka planda çalışan yardımcıları istiflemiyor), şöyle bir şey kullanabilirsiniz:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

Sonra yoğun zaman başladığında, bir SIGSTOP gönderin:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

Daha sonra, sunucu tekrar boştayken, devam et.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

Bunu, yürütülmesini istediğiniz belirli zamanlar için zamanlamanız gerekir, bunu planlamak için cron veya sistem zamanlayıcıları (veya benzeri diğer çeşitli araçlar) gibi araçları kullanabilirsiniz. Bir zaman aralığına dayalı zamanlama yerine, kopyanın ne zaman duraklatılacağına / sürdürüleceğine karar vermek için sunucuyu izlemeyi (belki de ortalama yükü, işlemci kullanımını veya sunucu günlüklerindeki etkinliği) izlemeyi seçebilirsiniz.

Ayrıca, PID dosyasını yönetmeniz gerekir (bir tane kullanıyorsanız), hala duraklatmadan önce kopyanızın hala çalıştığından emin olun, muhtemelen kopya bittikten sonra pid dosyasını kaldırarak temizlemek isteyeceksinizdir.

Başka bir deyişle, güvenilir hale getirmek için bu konuda daha fazla şeye ihtiyacınız var, ancak bu SIGSTOP ve SIGCONT sinyallerini bir işlemin yürütülmesini duraklatmak / sürdürmek için kullanmanın temel fikri aradığınız şey gibi görünüyor.



1
Belki de '/var/run/bigcopy.pid' ifadesinin hala düşündüğünüz aynı süreçle ilgili olduğuna çok dikkat etmeniz gerektiğini hatırlatmak için bir şeyler ekleyin. sistemdeki diğer işlemleri rasgele durdurma istenmeyebilir. Pid'in, düşündüğünüz programa atıfta bulunmasını sağlamanın güvenli bir yolunun olmadığını biliyorum ...
Evan Benn,

@EvanBenn Evet, demek istediğim bu, “kesinlikle kopukluğun duraklamadan önce hala çalıştığından emin olun” derken, amacınız kesinlikle bundan daha açık olsa da! Evet, PID'leri kontrol etmek doğal olarak yarış-y, bu nedenle bazen% 100 güvenilir bir şekilde yapmak gerçekten mümkün değil ...
filbranden

@ cat Gerçekten değil, bir işlem SIGSTOP'u engelleyemiyor. İlk yorumdaki bağlantıya bakın: "SIGSTOP, SIGKILL gibi engellenemez bir sinyaldir" (ya da sadece google’ın durumunun böyle olduğunu göreceksiniz.)
03:42

76

Süreci askıya almak yerine, daha düşük bir öncelik de verebilirsiniz:

renice 19 "$pid"

En düşük önceliği (en yüksek nezaket) verecek, böylece işlem CPU'yu çoğu zaman ihtiyaç duyan diğer işlemlere verecek.

Linux'ta, aynısı I / O ile de yapılabilir ionice:

ionice -c idle -p "$pid"

İşlemi "boşta" sınıfına koyacak , böylece yalnızca başka hiçbir program tanımlanmış bir yetkisiz kullanım süresi için disk G / Ç istemediğinde disk zamanı alacaktır .


22
Bu, bir XY probleminin tipik bir örneğidir . Soru bir sürecin nasıl duraklatılacağıydı, ancak bu soruya cevap vermiyor. Gerçekten önceliği düşürmek asıl soruna daha iyi bir yaklaşım olsa da , soruyu cevaplamıyor. Ben ediyorum düzenleme aynı zamanda bir işlemini durdurması için bir sorun olabilir duraklatma neden (örneğin dosya durdurulmuş iken düzenlenmiş olabilir) nasıl dahil etmek soruyu.
MechMK1

22
@DavidStockinger, teknik olarak, bu cevap, işletim sistemine (işletim sistemi, CPU, G / Ç zamanlayıcı) meşgulken (bir seferde saniyeler içinde bile olsa) işlemi duraklatmasını söyleyecektir. Sürecin manuel olarak askıya alınması diğer cevaplarda zaten ele alınmıştır. Bu çözüm, dosyaların kopyalanırken değiştirilme sorununu ele almaz.
Stéphane Chazelas

5
G / Ç önceliğini değiştirmek her zaman en iyi çözüm değildir. Dönen disklerden kopyalama yapıyorsanız, düşük öncelikli işlemi tamamen duraklatırsanız, oluşmayacağınız her yüksek öncelikli isteğin önüne bir arama yapabilirsiniz.
Mark

2
Düşük öncelik, sorunu bile çözmez. Kutu birkaç saniye veya dakika boyunca tamamen boş kalsa bile, bu, dosya sistemi önbelleğindeki her şeyi çıkaracak büyük bir kopya işleminin göze çarpmayacağı anlamına gelmez. Tekrar bir yük olur olmaz, her şeyi geri çağırmak çok yavaş olacak.
R.

2
@DavidStockinger, XY problemleriyle uğraşmanın tercih edilen yolu , sorulan soru olmasa bile doğru çözümü sağlamaktır. Soruda açıklanan yaklaşımın yanlış olduğunu bildiğiniz zaman, iyi bir cevap bu yanlış yaklaşımı vermez, bunun yerine daha iyi bir yaklaşım önerir.
terdon

8

Bu senaryo için rsync kullanın, cp'yi unutun. Bant genişliğini sınırlamak için parazitler var veya google rsync example / s bıraktığı şekilde devam edecek şekilde öldürülebilir / durdurulabilir ve daha sonra başlatılabilir.


3

Çalışan işlemi durdurarak yapacaksanız, Ekran programıyla oynamanızı öneririm. Linux'u bir süredir kullanmadım, ancak IIRC sadece komutu duraklatıyor ve devam ettiriyorsa sizi oldukça savunmasız bırakıyor, yanlışlıkla oturumu kapatırsanız oturumunuza devam edemezsiniz.

Ekranı ile oturumu durdurabileceğinizi ve sonra ayıracağınızı ve oturumu kapatabileceğinizi düşünüyorum. Sonra tekrar içeri girip o oturuma tekrar bağlanabilirsiniz. Onunla biraz oynamak zorunda kalacaktınız ancak oturumları çok daha sağlam hale getirdi.

Ayrıca, oturumu kapatıp eve gidebilir, daha sonra uzaktan oturum açabilir, ofise başlattığınız sistemi yeniden bağlayabilir ve akşam için devam ettirebilir, ertesi gün işyerinde tekrar alabilirsiniz.


Ben zaten tha için tmux kullanıyorum. Ancak, kendinden haberdar olan veya tercihen çevreye duyarlı bir senaryo yazıyorum, bu nedenle sunucunun yoğun trafiği olursa durur ve normal olduğunda devam eder.
Sollosa

0

Eğer kabuğunuz destekliyorsa (neredeyse hepsi yaparsa), SIGTSTPön plan görevine kolayca bir sinyal göndermek için ^ Z (Ctrl + Z) tuşlarına basıp ardından fg(ön planda) veya bg(arka planda) ile devam edebilirsiniz .

Bunu birden fazla görevde yaparsanız ve sonradan onlara geri dönmek istiyorsanız, jobskomutu kullanabilir , sonra fg/bg %#da işle ilgili parantez içinde verilen sayı ile birlikte dönebilirsiniz .

Unutmayın SIGTSTPbiraz daha farklıdır SIGSTOP, en önemlisi nedeniyle ihmal edilebilir olması (diğer tüm cevaplara kullanılır) (ama bir program diğerinden daha görmezden ben görmedim sl). StackOverflow'ta bu cevapta daha fazla ayrıntı bulabilirsiniz .


Bunun henüz bir cevabı olmadığını şaşırttı.
Ave

Ty Ave, bu çok görevli numarayı biliyorum. Fakat bunun gerçekleşmesi için birinin terminalde olması gerekir, oysa, işi ne olursa olsun, işi kendi başına yapacak bir senaryo hazırlayacaktım.
Sollosa

@Sollosa aynı soru ile başkalarına ve bir terminale erişim için faydalı olabilir.
Ave

Katılıyorum. Seni tanımak güzel Ave :)
Sollosa
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.