Soru Oturumumdan sonra çalışan bir linux işleminin devam ettirilmesi


SSH üzerinden bir Linux makinesine bağlanıyorum ve dosya sistemi işlemlerini yapan ağır bir bash komut dosyasını çalıştırmaya çalışıyorum. Saatlerce çalışmaya devam etmesi bekleniyor, ancak sahip olduğum internet bağlantıları nedeniyle SSH oturumunu açık bırakamam.

Komut dosyasını arka plan operatörü ve işareti ile çalıştırdığından şüpheliyim (&), hile yapacak, çünkü denedim ve daha sonra işlemin tamamlanmadığını gördü. İşlemi nasıl durdurabilir ve saklayabilirim?


139
2017-09-15 06:00


Menşei




Cevaplar:


En iyi yöntem, bir terminal çoklayıcıda işlemi başlatmaktır. Alternatif olarak, işlemin HUP sinyalini almasını sağlayabilirsiniz.


bir terminal çoklayıcı "gerçek" terminalden bağımsız olarak çalışan "sanal" terminaller sağlar (aslında bugün tüm terminaller "sanal" dır, ancak bu başka bir gün için başka bir konudur). Gerçek terminaliniz ssh oturumunuzla kapalı olsa bile sanal terminal çalışmaya devam edecektir.

Sanal terminalden başlatılan tüm işlemler bu sanal terminalle çalışmaya devam edecektir. Sunucuya yeniden bağlandığınızda, sanal terminale yeniden bağlanabilir ve her şey, geçen zamandan başka hiçbir şey olmamış gibi olur.

İki popüler terminal çoklayıcı ekran ve tmux.

Ekranda dik bir öğrenme eğrisi var. İşte konsepti açıklayan diyagramlar ile iyi bir öğretici: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


HUP Terminal kapatıldığında terminal tarafından tüm çocuk işlemlerine sinyal (veya SIGHUP) gönderilir. SIGHUP’un alınmasıyla ilgili genel eylem sonlandırmaktır. Böylece ssh oturumunuz kesildiğinde tüm süreçleriniz sonlanır. Bundan kaçınmak için süreçlerinizi SIGHUP almazsınız.

Bunu yapmanın iki kolay yolu nohup ve disown.

Nasıl hakkında daha fazla bilgi için nohup ve disown bu soruyu okuyor ve cevaplıyor: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Not: Süreçler çalışmaya devam etmesine rağmen artık herhangi bir terminale bağlı olmadıkları için onlarla etkileşime giremezsiniz. Bu yöntem, bir kez başlatıldığında, artık herhangi bir kullanıcı girdisine ihtiyaç duymayan uzun süreli toplu işlemlerde kullanışlıdır.


133
2017-09-15 06:05



Bu yanıtı hem etkileşimli hem de etkileşimli olmayan durumlar için bir çözüm sağladığı için seviyorum. İnteraktif durumda, screen size çok daha fazla seçenek sunar, ancak kullanıyorsanız authorized_keys Kişilerin uzaktan bir komut dosyasını çalıştırmasına izin vermek için ssh, nohup seçeneği, komut dosyasının daha uzun süren işlemleri başlatması için güzel ve basit bir yoldur ssh oturum başlatmak için kullanılır. - Mark Booth
@rahmanisback - Kabul edilen cevabınızı istediğiniz zaman değiştirebileceğinizi unutmayın. Erica'nın cevabı şu ana kadar en yüksek oyu aldığınız için, bu sizin için en iyi cevap anlamına gelmez, aslında kabul edilen cevabınız, daha fazla insanı iyi bir cevap olarak oylamaya teşvik edebilir. - Mark Booth
* Öksürük * tmuxisbetter * öksürük * - crasic
tmux > ekran. Deneyin, asla geri dönmeyeceksin. - h0tw1r3
@TheLQ - byobu olduğu GNU Ekranı. Ekranı hala kullanıyorsunuz, sadece çok özelleştirilmiş .screenrc ile. - EEAA


Bunu yapmanın birkaç yolu var, ancak en kullanışlı bulduklarım kullanmak GNU Ekranı.

Ssh sonra, koş screen. Bu, ekranda çalışan başka bir kabuk başlatır. Komutunu çalıştır, sonra yap Ctrl-bir  d.

Bu, ekran oturumundan sizi "kesecek". Bu noktada, çıkış yapabilir veya istediğiniz başka bir şey yapabilirsiniz.

Ekran oturumuna yeniden bağlanmak istediğinizde, sadece koşun screen -RD Kabuk isteminden (oturumu oluşturan aynı kullanım kullanıcısı olarak).


92
2017-09-15 06:07



Korku veren! Temiz cevap, teşekkürler ... - rahmanisback
Ekranın tamamı Ctrl-a ile başlayan bir sürü komut içerir. Sadece bir tane daha öğrenirseniz, "Ctrl-a?" İle başlayın. O zaman "Ctrl-a c" ve "Ctrl-a n" yi öğrenmeyeceksin. - olafure
@olafure +1, teşekkürler. Ekranın benim temel araç kutusundan çıkacağı anlaşılıyor. - rahmanisback
tmux > ekran. Deneyin, asla geri dönmeyeceksin. - h0tw1r3
Tmux için +1. 5 hafta önce ekrandan vazgeçtim. - Bryan Hunt


İçinde bash, disown anahtar kelime buna mükemmel şekilde uyar. Öncelikle, sürecinizi arka planda çalıştırın ( &veya ^Z sonra yazın bg):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

Yazarak jobs işlemin hala kabuk tarafından sahip olduğunu görebilirsiniz:

$ jobs
[1]+  Running  wget

Bu noktada çıkış yapacak olsaydınız, arka plan görevi de öldürülecekti. Ancak, koşarsanız disown, bash işi bırakır ve çalışmaya devam etmesine izin verir:

$ disown

Bunu doğrulayabilirsiniz:

$ jobs
$ logout

Hatta birleştirebilirsiniz & ve disown Aynı satırdaki gibi:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

Bu koşmaktan daha iyidir nohup benim görüşüme göre ayrılmıyor nohup.out dosyalar dosya sisteminizin her yerine çöktü. Ayrıca, nohup komutu çalıştırmadan önce çalıştırılmalı - disown Daha sonra yalnızca arka plan yapmak istediğinizde ve görevi çıkarırsanız kullanılabilir.


70
2017-09-15 12:27



Bu çok iyi bir cevap, 1+. Nohup veya Screen'in tek tercihi, bash'ın bağımsızlığı olacaktır ve diğer kabuklarla birlikte kullanılabilir. Ama bash kullanıyorum her zaman yaklaşımınıza bağlı kalacağım. - rahmanisback
Evet - bu bash'a özgüdür, çünkü bash şimdiye dek kullandığım tek kabuktur. Başka kabukların benzer bir şeyi desteklemesi (yani nohup olmadan arka planda başlatılması) - başka birinin başka kabuklar için başka cevaplar gönderebilmesi harika olurdu. - Jeremy Visser
cevabımı, herhangi bir şaşkınlıkla nasıl yapılacağını gösterme - w00t
Daha sonra karar verebilmek için +1. Sadece bu an için buna ihtiyacım vardı. ilan edildiği gibi çalıştı - code_monk


Çoğu Linux kutusunda bulunan araç nohup bunu yapacak.


37
2017-09-15 06:14



Bu en basit cevaptır. Herhangi bir çıkış otomatik olarak nohup.out'a yönlendirilir ve daha sonra incelenebilir. - Julian
nohup hiç zsh gerektirmez. - Aaron Brown
nohup doğru cevaptır, hiçbir kapanma için kısadır. - Kinjal Dixit
nohup çok daha fazla makinede ekrana gelir, bu yüzden onu nasıl kullanacağınızı bilmelisiniz. - Zenon


Sadece eksiksiz olmak için, işaret edeceğim tmuxEkranla aynı temel fikre sahip olan:

tmux, GNU ekran gibi programlara modern, BSD lisanslı bir alternatif olmayı amaçlamaktadır. Başlıca özellikleri şunlardır:

  • Güçlü, tutarlı, iyi belgelenmiş ve kolayca okunabilir bir komut arayüzü.
  • Bir pencere yatay ve dikey olarak bölmelere ayrılabilir.
  • Bölmeler serbestçe taşınabilir ve yeniden boyutlandırılabilir veya önceden belirlenmiş düzenler halinde düzenlenebilir.
  • UTF-8 ve 256 renkli terminaller için destek.
  • Birden fazla arabelleğe kopyalayıp yapıştırın.
  • Pencereleri, oturumları veya istemcileri seçmek için etkileşimli menüler.
  • Hedefte metin arayarak mevcut pencereyi değiştirin.
  • Terminal kilitleme, manuel veya zaman aşımından sonra.
  • Aktif geliştirme altında temiz, kolay genişletilmiş, BSD lisanslı bir kod tabanı.

Bununla birlikte, Google'da arama yapmak neredeyse sınırsızdır.


27
2017-09-15 06:23



kullanma "gnu screen" arama sorgunuz oldukça iyi çalışıyor. - gnur
Tmux için +1000! - mbq


Ekran kapandığında süreçleri çalışır durumda tutmak için overkill.

Deneyin dtach:

Dtach, C 'nin ayrılma özelliğini öykünen bir programdır.   Bir programın bir ortamda yürütülmesini sağlayan ekran   Kontrol terminalinden korunmaktadır. Örneğin, program   dtach'ın kontrolü altında terminalden etkilenmeyecekti   bazı sebeplerden dolayı kesildi.

dtach yazılmıştır çünkü ekran ihtiyaçlarımı yeterince karşılamamıştır; ben   ekranın çoklu özellik desteği gibi ekstra özelliklerine ihtiyaç duymadı   terminaller veya terminal emülasyonu desteği. ekran da çok büyüktü   hantal ve anlamak zor bir kaynak kodu vardı.

ekran ayrıca tam ekran uygulamalarını kullanmamı engelledi   akışının aşırı yorumu nedeniyle emacs ve ircII   Program ve bağlı terminaller arasında. dtach bir yok   terminal emülasyon katmanı ve ham çıktı akışını geçirir   Bağlı terminallere program. Tek giriş işlemi bu   dtach yapmak, ayırma karakterini taramaktır (bu sinyaller   dtach programdan çıkartmak ve askıya alma anahtarını işlemek için   (dtach'in, kendisini etkilemeden geçici olarak askıya almasını söyler.   çalışan program) ve bunların ikisi de istenirse devre dışı bırakılabilir.

Ekranın tersine, dtach en az özelliklere sahiptir ve son derece küçüktür.   Bu, dtach'in hatalar ve güvenlik için daha kolay denetlenmesini sağlar   delikler, ve alanın sınırlı olduğu ortamlarda erişilebilir olmasını sağlar.   kurtarma diskleri gibi.


11
2017-09-15 15:06



Teşekkür ederim. Buraya sadece dtach hakkında yazı yazmaya geldim. Şimdi terminal kopması için gitmem gereken şey şu; Ekranda çok fazla YÜKSEK, ve giriş ile saçma bir derece müdahale eder. Gerçek ekranın kendi termcapı olması oldukça rahatsız edici. - fluffy


İşte, herhangi bir kabuk sürecini, ihtiyaç duyulan harici programlara göz atmanın bir yolu:

( while sleep 5; do date; done ) <&- >output.txt &

Daha sonra oturumunuzu kapattığınızda, iş, output.txt dosyası tarafından kanıtlandığı gibi çalışmaya devam eder (arabelleğe alma özelliği vardır, bu nedenle sıfır olmayan bir süre göstermesi gerekir). Test ettikten sonra işini öldürmeyi unutma.

Yani tüm yapmanız gereken stdin yakın ve işi arka plan. Gerçekten iyi olmak için, önce cd / bu yüzden bir bağlantıya tutunmazsınız.

Bu, Solaris altında basit bir şekilde bile çalışır.


9
2017-09-16 16:48



İlginç. Bu bazı önemli sorular ortaya çıktı. STDIN'i hiçbir şeye ayarladığınızı görebiliyorum. - Şebeke? Arasındaki fark nedir < /dev/null ve &- ? Ben STDIN (ve STDOUT ve STDERR diğerleri) tarafından bir dosya tarafından atanabilir sanırım < fileveya bir akış <& stream STDIN durumunda. Kullanarak aynı olur mu < /dev/null Yukarıdaki örnekte? Ve operatör - yukarıda akış olarak bir null başvurur? - rahmanisback
X <& - yaptığınızda, bu dosya tanıtıcıyı x kapatır. Bu durumda, bash varsayılanını 1'e, yani standart girdiye yapan x yoktur. </ Dev / null kullanırsanız, stdin'i kapatmıyorsunuz, programa giriş olarak boş bir dosya veriyorsunuz. - w00t
Ve dürüst olmak gerekirse, bunun neden çalıştığını sorduğunu gerçekten bilmiyorum :-) İşe yaramıyor, üretimde kullanıyoruz. Özel bir şeye ihtiyaç duymadan bir süreçte kabuk içinde bir süreci canlandırabileceğimi umarak keşfettim - bu yüzden stdin'i kapatarak başladım ve bu yeterliydi. Bazı kabuk kaynaklarını okumaya devam etmeliyim ama eğer stdin'i kapatır ve süreci tekrarlarsanız, süreci de koparır. - w00t
Bunun nedeni, bir ebeveyn işleminin çocuğunun stdin tutamacını kapatması durumunda SIGHUP (çocuğun, kabuk öldüğünde çocuğun çıkmasına neden olan gerçek sinyal) tetiklendiğini düşünüyorum. Ancak eğer stdin Başlamak null olarak, gerçekte kapatılmak yerine, ebeveynin SIGHUP'u tetiklemesinin bir yolu yoktur. Güzel bul, yine de - bunu asla düşünmezdim. - Jeremy Visser
@JeremyVisser gerçekten mantıklı geliyor! - w00t


at Komut bu tür bir durum için yararlı olabilir. Örneğin, şunu yazın:

at now

Ve sonra çalıştırılacak bir komut veya komut dizisi girebilirsiniz. E-posta doğru bir şekilde makineye kurulursa, sonuçlar size e-posta ile gönderilmelidir.

Yerine nowisteğe bağlı olarak bir tarihle veya bir zaman ifadesi gibi bir zaman belirtebilirsiniz now + 15 minutes. Görmek man at daha fazla ayrıntı için.


7
2017-09-16 08:23