Oturumu kapattıktan sonra linux işlemini devam ettirmek


142

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

Komut dosyasını arkaplan operatörü, ampersand ( &) ile çalıştırmanın hile yapacağından şüpheliyim , çünkü denedim ve daha sonra işlemin tamamlanmadığını öğrendim. Çıkış yapıp işlemin devam etmesini nasıl sağlayabilirim?

Yanıtlar:


135

En iyi yöntem, işlemi bir terminal çoklayıcıda başlatmaktır. Alternatif olarak, HUP sinyalini almayan işlemi de yapabilirsiniz.


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

Sanal terminalden başlatılan tüm işlemler o sanal terminalle çalışmaya devam edecektir. Sunucuya tekrar bağlandığınızda sanal terminale yeniden bağlanabilirsiniz ve her şey geçen zaman dışında hiçbir şey olmamış gibi olacaktır.

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

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


HUP terminali kapatıldığında sinyal (ya da SIGHUP) tüm alt süreçlere terminal tarafından gönderilir. SIGHUP aldıktan sonra ortak eylem sonlandırmaktır. Böylece ssh oturumunuz kesildiğinde tüm işlemleriniz sona erecek. Bundan kaçınmak için işlemlerinizi SIGHUP alamazsınız.

Bunu yapmanın iki kolay yolu nohupve disown.

Nasıl nohupve nasıl disownçalıştığı hakkında daha fazla bilgi için bu soruyu ve yanıtı okuyun: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Not: İşlemler çalışmaya devam etse de, artık hiçbir terminale bağlı olmadıkları için onlarla etkileşime geçemezsiniz. Bu yöntem temel olarak, bir kez başlatıldığında artık kullanıcı girişi gerektirmeyen uzun süren toplu işlemler için kullanışlıdır.


3
Hem interaktif hem de interaktif olmayan durumlar için bir çözüm sağladığı için bu cevabı seviyorum. İnteraktif durumda, screensize çok daha fazla seçenek sunar, ancak authorized_keysinsanların bir komut dosyasını uzaktan çalıştırmasına izin vermek için kullanıyorsanız ssh, nohupseçenek, komut dosyası için sshonları başlatmak için kullanılan oturumdan daha uzun süren işlemleri başlatmak için güzel ve basit bir yoldur. .
Mark Booth,

1
@rahmanisback - Kabul edilen cevabınızı istediğiniz zaman değiştirebileceğinizi unutmayın. Sırf EricA’nın cevabının en fazla oylanması, sizin için en iyi cevap olduğu anlamına gelmiyor, aslında kabul ettiğiniz cevabınız, daha fazla insanın bunu iyi bir cevap olarak oy kullanmasını teşvik edebilir.
Mark Booth,

3
* öksürük * tmuxisbetter * öksürük *
crasic

3
tmux > ekran. Deneyin, asla geri dönmeyeceksiniz.
h0tw1r3 16:11

1
@TheLQ - byobu olan GNU Ekran. Hala çok özel bir ekran görüntüsü ile ekran kullanıyorsunuz.
EEAA

92

Bunu yapmanın birkaç yolu var, ancak en yararlı bulduğum şey GNU Ekranını kullanmak .

Şşş yaptıktan sonra koşun screen. Bu ekran içinde çalışan başka bir kabuk başlayacaktır. Komutunuzu çalıştırın, sonra bir Ctrl- a d.

Bu işlem sizi ekran oturumundan "keser". Bu noktada, oturumu kapatabilir veya istediğiniz herhangi bir şeyi yapabilirsiniz.

Ekran oturumuna yeniden bağlanmak istediğinizde, sadece screen -RDkabuk isteminden çalıştırın (oturumu oluşturan aynı kullanıcı kullanıcısı).


6
Ekranın hepsinde Ctrl-a ile başlayan bir sürü komut var. Sadece bir tane daha öğrenirseniz, "Ctrl-a?" İle başlayın. O zaman "Ctrl-a c" ve "Ctrl-a n"
olafure

@olafure +1, teşekkürler. Ekran benim birincil araç kutumda olacak gibi görünüyor.
doc_id 15:11

tmux > ekran. Deneyin, asla geri dönmeyeceksiniz.
h0tw1r3 16:11

Tmux için +1. 5 hafta önce ekrandan vazgeçtim.
Bryan Hunt

73

İçinde bash, disownanahtar kelime buna mükemmel şekilde uyar. İlk önce işleminizi arka planda çalıştırın (ya kullanın &ya da ^Zardından yazın bg):

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

Yazarak jobs, işlemin hala kabuğa ait olduğunu görebilirsiniz:

$ jobs
[1]+  Running  wget

Bu noktada oturumu kapatırsanız, arka plan görevi de ölür. Ancak, disownkoşarsanız, bash işi keser ve çalışmaya devam etmesine izin verir:

$ disown

Bunu onaylayabilirsiniz:

$ jobs
$ logout

Şunu &ve disownaynı satırda birleştirebilirsiniz , örneğin:

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

Bu nohupbenim görüşüme göre çalıştırmaktan daha iyidir , çünkü nohup.outdosya sisteminizin her yerinde dosyaları karışmaz. Ayrıca, nohupkomutu çalıştırmadan önce çalıştırılmalıdır - disowngörevi daha sonra arkaplan ve ayırmak istediğinize karar verirseniz kullanılabilir.


1
Bu çok iyi bir cevap, 1+. Nohup veya Screen için tek tercih, bash'ın bağımsızlığı olacaktır ve diğer kabuklarla kullanılabilir. Ama ne zaman bash kullansam senin yaklaşımına sadık kalacağım.
doc_id 15:11

Evet - bu bash'a özgüdür, çünkü bash şimdiye kadar kullandığım tek kabuktur. Diğer mermilerin benzer bir şeyi destekleyip desteklemediğini merak ediyorum (yani nohup olmadan arka planda başlatmak) - birisinin diğer mermiler için başka cevaplar göndermesi harika olurdu.
Jeremy Visser

1
nasıl göründüğümü gösteren cevabımı görmek isterim sh-lookalike
w00t

1
+1, daha sonra karar verebilmek için. Sadece bu an buna ihtiyacım vardı. ilan edildi olarak çalıştı
code_monk

37

Çoğu Linux kutusunda bulunan nohup aracı bunu yapacak.


1
Bu çok basit bir cevap. Herhangi bir çıktı otomatik olarak nohup.out'a yönlendirilir ve daha sonra incelenebilir.
Julian

3
nohup hiç zsh gerektirmez.
Aaron Brown

nohup doğru cevap, hiç takılma için kısa.
Kinjal Dixit

2
nohup, ekrandan çok daha fazla makinede bulunur, bu yüzden nasıl kullanılacağını bilmek gerekir.
Zenon

27

Tam olarak, ekranla aynı temel fikre sahip olan tmux’a işaret edeceğim :

tmux'un GNU ekranı gibi programlara modern, BSD lisanslı bir alternatif olması amaçlanmıştır. Başlıca özellikleri:

  • Güçlü, tutarlı, iyi belgelenmiş ve kolayca komut dosyası yazılabilen bir komut arayüzü.
  • Bir pencere yatay ve dikey olarak camlara bölünebilir.
  • Bölmeler serbestçe hareket ettirilebilir ve yeniden boyutlandırılabilir veya önceden ayarlanmış düzenlere yerleştirilebilir.
  • UTF-8 ve 256 renkli terminaller için destek.
  • Birden çok arabellekle kopyalayıp yapıştırın.
  • Pencereleri, oturumları veya istemcileri seçmek için etkileşimli menüler.
  • Hedefte metni arayarak mevcut pencereyi değiştirin.
  • Terminal kilitleme, manuel olarak veya bir zaman aşımından sonra.
  • Aktif geliştirilmekte olan temiz, kolay genişletilmiş, BSD lisanslı bir kod tabanı.

Bununla birlikte, Google’da arama yapmak yaklaşık olarak daha kolaydır.


2
"gnu screen"Arama sorgunuz olarak kullanmak oldukça iyi çalışıyor.
gnur

4
Tmux için +1000!
mbq

11

Ekran, oturumu kapattığınızda işlemlerin devam etmesini sağlamak için geçersizdir.

Deneyin dtach :

dtach, bir programın kontrol terminalinden korunan bir ortamda yürütülmesine izin veren ekranın ayırma özelliğini taklit eden bir programdır. Örneğin, dtach'ın kontrolü altındaki program, bir nedenden dolayı bağlantı kesilmesinden etkilenmeyecektir.

dtach yazıldı, çünkü ekran benim ihtiyaçlarımı yeterince karşılamıyordu; Birden fazla terminal desteği veya terminal emülasyon desteği gibi ekranın ekstra özelliklerine ihtiyacım yoktu. ekran da çok büyüktü, hacimli ve anlaşılması zor olan kaynak koduna sahipti.

ekran ayrıca program ve bağlı terminaller arasındaki akımın aşırı şekilde yorumlanması nedeniyle emacs ve ircII gibi tam ekran uygulamaları kullanmama da engel oldu. dtach bir terminal emülasyon katmanına sahip değildir ve programın ham çıkış akışını ekli terminallere geçirir. Dtach'ın yaptığı tek giriş işlemi, ayırma karakterini (programdan ayırmak için dtach'ı işaret eden) taramak ve askıya alma anahtarını (çalışan programı etkilemeden kendisini geçici olarak askıya almasını söyleyen) işlemesidir ve bunların her ikisi de istenirse devre dışı bırakılabilir.

Ekranın aksine, dtach minimal özelliklere sahiptir ve oldukça küçüktür. Bu, dtach'ın hatalar ve güvenlik delikleri için daha kolay denetlenmesini sağlar ve kurtarma diskleri gibi alanın sınırlı olduğu ortamlarda erişilebilir olmasını sağlar.


Teşekkür ederim. Buraya sadece dtach hakkında yazı yazmak için geldim. Bu şimdi terminal ayrılması için benim gitmem gereken şey; ekran çok fazla WAY yapar ve girişi saçma bir dereceye kadar engeller. Ekranın kendi termcap'ine ihtiyacı var aslında oldukça rahatsız edici.
kabarık

9

İşte herhangi bir kabuk sürecini canlandırmanın bir yolu, dış programlara gerek yok:

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

Daha sonra oturumunuzu kapattığınızda, iş output.txt dosyasında gösterildiği şekilde çalışmaya devam eder (arabelleğe alma işlemi vardır, bu nedenle sıfıra aykırı görünmesi biraz zaman alır). Testten sonra işini öldürmeyi unutma.

Yapmanız gereken tek şey stdin'e yakın olmak ve işi arka plan yapmak. Gerçekten iyi olmak için ilk önce cd /bir dağa tutmuyorsun.

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


İlginç. Bu dikkate değer bazı sorular ortaya çıktı. STDIN’i hiçbir şeye ayarladığınızı görebiliyorum, -operatör? Arasındaki fark nedir < /dev/nullve &-? STDIN'e (ve diğer STDOUT ve STDERR'ye) , STDIN durumunda bir dosya < fileveya bir akış tarafından atanabileceğini tahmin ediyorum <& stream. < /dev/nullYukarıdaki örnekte kullandığınızla aynı mı olurdu ? Ve -yukarıdaki işleç , akış olarak boşa mı işaret ediyor?
doc_id 16:11

X <& - yaptığınız zaman, bu dosya tanımlayıcısını x kapatır. Bu durumda, bash'i 1'e, yani standart girişe varsayılan yapan x yoktur. </ Dev / null kullanıyorsanız, stdin'i kapatmıyorsunuz, programa giriş olarak boş bir dosya veriyorsunuz.
w00t

1
Ve dürüst olmak gerekirse, bunun neden çalıştırdığın şeye zarar verdiğini gerçekten bilmiyorum. :-) Yine de çalışıyor, üretimde kullanıyoruz. Özel bir şeye ihtiyaç duymadan kabuklu bir süreci canlandıracağı umuduyla uğraşırken keşfettim - bu yüzden stdin'i kapatarak başladım ve bu yeterliydi. Bazı kabuk kaynaklarını okumalıyım ama sanırım stdin'i kapatıp süreci arkalarsanız işlemi de keser.
w00t

2
Bunun sebebi, bir ana süreç çocuğunun stdin tutamacını kapattığında bir SIGHUP'ın (çocuğun kabuk öldüğü zaman bırakmasına neden olan gerçek sinyal) tetiklenmesidir. Bununla birlikte, eğer stdin gerçekte kapalı olmak yerine, boş olarak başlarsa , ebeveynin SIGHUP'ı tetiklemesinin yolu yoktur. Güzel bul - olsa da, asla bunu düşünmezdim.
Jeremy Visser

@JeremyVisser kulağa gerçekten mantıklı geliyor!
w00t

7

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

at now

Ve daha sonra çalıştırılacak olan bir komutu veya bir dizi komutu girebilirsiniz. Makinede e-posta doğru kuruluysa, sonuçlar size e-posta ile gönderilmelidir.

Bunun yerine, nowisteğe bağlı olarak bir tarih içeren bir saat veya benzeri bir zaman ifadesi belirleyebilirsiniz now + 15 minutes. Daha man atfazla ayrıntı için bakınız.


7

byobuUbuntu'da ekran için güzel bir ön uç. Ctrl- tuşuna basarak ?tüm klavye kısayollarının bir listesini alabilirsiniz. CPU yükünü, disk alanını vb. İzlemek için yararlı olabilecek bir durum çubuğu ekler. Genel olarak, terminal tabanlı bir VNC bağlantısı olarak tanımlayacağım bir deneyim sunar.

nohup Bir işin arka planda bir çıktının alındığı bir günlük dosyasına yönlendirilmesine izin verir, gerekli değilse her zaman / dev / null'a yönlendirilebilir.

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.