Ssh oturumunu sonlandırdıktan sonra işlemlerin nasıl devam etmesi sağlanır?


Yanıtlar:


750

Bunun gibi modern alternatifler aramalısınız tmux.

tmuxscreenbirçok nedenden ötürü üstündür , işte bazı örnekler:

  • Windows oturumu arasında hareket ettirilebilir ve hatta birden çok oturuma bağlanabilir
  • Windows yatay ve dikey olarak bölmelere bölünebilir
  • UTF-8 ve 256 renkli terminal desteği
  • Oturumlar, bir oturum girmeye gerek kalmadan kabuktan kontrol edilebilir

Temel İşlevsellik

Tavsiye cevabında açıklandığı gibi aynı işlevselliği elde etmek screeniçin aşağıdakileri yapmanız gerekir:

  • uzak makineye ssh
  • kabuğa tmuxyazarak başlayıntmux
  • Başlatılan tmuxoturumda istediğiniz işlemi başlatmak
  • / ayrılmak ayırmak tmuxyazarak oturumu Ctrl+ bsonra ved

Artık uzaktaki makineden güvenle oturum açabilirsiniz, işleminiz içeride çalışmaya devam eder tmux. Tekrar geri döndüğünüzde ve işleminizin durumunu kontrol etmek istediğinizde oturumunuza tmux attacheklemek için kullanabilirsiniz tmux.

Yan yana çalışan birden çok oturum yapmak istiyorsanız, her oturumu Ctrl+ bve ile adlandırmanız gerekir $. Şu anda çalışan oturumların bir listesini kullanarak tmux list-sessions, şimdi çalışan bir oturuma komutu ile ekleyin tmux attach-session -t 0.

tmuxTek bir oturumda tek bir pencereyi ele almaktan çok daha gelişmiş şeyler yapabilir. Daha fazla bilgi için bakınız man tmuxveya tmux GitHub sayfasına . Özellikle, iştescreen ve arasındaki ana farklar hakkında bir SSStmux .


4
@CraigM Yalnızca bir ekran oturumunuz aktifse, kısaca screen -x -r [screenname]veya kullanın screen -rx. Bu, mevcut bir ekran örneğini eklemenizi sağlar.
Lekensteyn

5
Bu tavsiye bana da aynı problemde yardımcı oldu, ancak bir yazım hatası olduğunu düşünüyorum. Ben yazdığınız gerektiğini eminim Ctrl-bsonra ve d/ terk ayırmak amacıyla tmuxoturumu. Tabii ki bu tmuxUbuntu 12.04 sürümüm için de geçerlidir.
cxrodgers

17
Yukarıdaki talimatları takip ederken bir hata yaptım. Herhangi biri aynı hataya düşebilirse paylaşacağım: Uzaktaki bilgisayarın kabuğu yerine kendi bilgisayarımın kabuğunda tmux'a başladım. Birinin uzaktaki bilgisayarın kabuğundaki tmux'u başlatması gerekiyor.
Mert Nuhoğlu,

5
Ekran şimdi yeniden geliştiriliyor: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Yanıtınızı güncelleyebilir misiniz?
muru

4
Alternatif olarak, tmux detachyazmak yerine koşctrl-b d
Andrew

305

Seçenek 1: nohup

En iyi yol genellikle en basittir.

nohup long-running-command &

Özellikle bunun için yapıldı, hatta stdout'u günlüğe kaydeder nohup.log.

man nohup

Seçenek 2: bg

Zaten çalışan bazı görevlerin "arkaplanını" yapmak istiyorsanız, en iyi seçeneğiniz Ctrl+ Zsonra koşmaktır.

bg

en son askıya alınmış görevinizi arka plana koymak ve çalışmaya devam etmesini sağlamak için.

Daha sonra hızlı bir şekilde disownoturumu kapattıktan sonra işlem devam etmelidir.

screenve diğerleri yapabilir, ama bunun için değil. nohupGeride bırakacağınızı bildiğiniz bggörevler için ve halen devam etmekte olduğunuz ve yeniden başlamak istemediğiniz görevler için öneririm .

Unutmayın, her ikisi de bash'a özgüdür. Bash kullanmıyorsanız, komutlar farklı olabilir.


4
Tavsiye ederimdisown -h
Michele

ilginç bir şekilde ekran ve tmux madenci için çalışmıyor, bur nohup çalışıyor
Yasin Okumuş

1
bg+ disownbenim için işe yaramadı. Ben tmux içinde başlatmayı unuttum ve bir toplantı için erken ayrılmak gerekiyordu çalışan bir dağıtım komut dosyası vardı. Komut sürekli olarak kabuk için ilerleme verir. ctrl+zişlemi durdurdu, beni bash'a geri verdi. bgSüreci yeniden başlattı, ancak aynı zamanda statüyü bash olarak çıkardı ve ne yazdığımı görmeyi imkansız hale getirdi. Ancak, bir disownkomut üretti "disown: current: böyle bir iş yok"
BrianHVB

Bu benim julia myFile.jliçin ne sebeple işe yaramadı . tmux yapar ve harikadır.
kilgoretrout

Bu benim için çalıştı, çok teşekkür ederim
Çad

207

Bunu kullanarak yapabilirsiniz screen.

Tip man screendaha fazla bilgi edinmek veya bu okumayı ekran adam sayfasını .

Basit senaryo:

  • Uzak kutunuza ssh. Yaz screenSonra, istediğiniz işlemi başlatın.

  • Basın Ctrl- Ao Ctrl- D. Bu, ekran oturumunuzu "ayıracak" ancak işlemlerinizi çalışır halde bırakacaktır. Artık uzaktaki kutudan çıkış yapabilirsiniz.

  • Daha sonra geri gelmek isterseniz, tekrar oturum açın ve screen -rBu, ekran oturumunuzu "devam ettirecek" şeklinde yazın ve işleminizin çıktısını görebilirsiniz.


32
Ekran oturumlarımı genellikle screen -S namedoğru olana daha kolay bağlanmayı kolaylaştırmak için kullanarak adlandırırım .
David Oneill

Bağlantı kapalı
Gab 好人 好人 16:16 '

1
Şahsen, herhangi bir paket kontrol yazılımı olmayan bir kutu üzerinde çalışıyorum. TMUX (kişisel olarak deneyimledim ve sevdiğim gibi) kaynağında yaklaşık yarım saatlik bir bina bağımlılığı yaptıktan sonra, ekranın benim için daha iyi ve daha basit bir çözüm olduğu ortaya çıktı. TL; DR: Bu sorunun en iyi çözümü, kullanım durumuna, makineye ve ne kadar zaman ayarlamanız gerektiğine bağlıdır. Bu cevap için teşekkürler :)
Max von Hippel

İle Kombinasyon screen -Sönce ayrılıp screen -rgeri gelirken inanılmaz!
Meloman

Bunun için teşekkürler. Bu çözüm benim için işe yaradı (tmux olmasa da (bir linux makinesine otururken pencereler için bash sürümü kullandım)
Michael Sorensen

83

Ekran ve nohup daha iyi bir yoldur, ancak zaten ekran olmadan çalışan bir işlemi ayırmak zorunda kalırsanız ya da nohup disown komutunu çalıştırabilirsiniz.

disown [-ar] [-h] [jobspec… |pid… ]

Seçenekler olmadan, her iş parçasını etkin iş tablosundan kaldırın . Eğer -hseçenek verilmiş iş tablodan kaldırılmaz, ancak kabuk bir SIGHUP alırsa o SIGHUP iş gönderilmez böylece işaretlenir. Eğer jobspec mevcut değildir ve ne -ade -rseçenek verilir, mevcut iş kullanılmaktadır. Hiçbir iş belirtilmezse , -aseçenek tüm işleri kaldırmak veya işaretlemek anlamına gelir; -rBir olmaksızın seçenek jobspec argüman işleri çalıştırma için operasyon kısıtlar.

Disown ile terminali kapatabilir ve işlemi makinede çalıştırabilirsiniz.


10
Bu aynı zamanda bunu yapmak için en sevdiğim yol. Sık kullanıyorumdisown -a && exit
Stefano Palazzo

1
Mükemmel. Bu hoş bir komuttur ve tüm artıları hak ediyor!
Greg

8
Dikkatli bir kelime, Ctrl-Z ile çalışan bir işlemi durdurdum ve aramadan önce arka planda başlatmadım disownve onu öldürdü.
HDave

3
Terminale yazmak istiyorsa çökebilir. Çalışan bir işlemin çıktısını yeniden yönlendirmek kolay değildir. Nohup ile düzgün başlatmak daha iyidir.
jiggunjer

2
Bu iyi bir cevaptır, çünkü soruyu doğrudan cevaplar. Sorunun yazarı, zaten uzun süredir devam eden komutları yerine getirdikten sonra ne yapılması gerektiğini sordu . Bu cevapların çoğu , komutları yerine getirmeden önce ne yapacağınızı bilmenizi sağlar.
q0rban

53

Büyük bir mv'ye takıldım ve süreci durduracak, kurulum ekranını ayarlayıp tekrar başlatacak konumda değildim. Esasen aşağıdaki adımları izleyerek çalışan ssh oturumundan çıkmayı başardım:

  1. ssh [sunucu]
  2. komuta
  3. Ctrl+Z
  4. bg
  5. disown [işlem pid isteğe bağlı, varsayılan süreler]
  6. çıkış

Adım 3 mevcut işlemi duraklatır (örneğin, 'mv' komutum).
Adım 4 duraklatılmış işlemi arka plana yerleştirir ve devam ettirir.
5. Adım, işlemden vazgeçmenizi sağlar. ** İşlerin listesini almak için jobsönce basitçe yazın .


** Yoksunluk hakkında (bash el kitabından):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

2
Yerleşikler her zaman ilk tercihimdir :) THX
ken_oy

Bu cevap doğru olarak işaretlenmelidir. Kurmak ve bu sorunu çözmek için ekrana alışmak abartılı.
Ulrich-Lorenz Schlüter

Zaten herhangi bir komutu başlattıysanız ve uzun süredir çalışıyorsanız bu çok yararlıdır. Bir TMUX Seansında sonlandırma ve başlatma zaman alacaktır
Deepali Mittal

1
@ tom-brossman: Lütfen bunun gibi gereksiz düzenlemelere dikkat edin ! İş belirtimi olmadan çağrılırsa, disownyerleşik komut en son arka plan işine göre hareket eder.
David Foerster

22

Birden fazla ssh bağlantısı üzerinden programları ve terminal durumunu korumak için kullanabileceğiniz iki ana program vardır. Bunlar ekran (görevliler ama maalesef bakımsız. Görünüşe göre aktif olarak geliştiriliyorlar ) ve tmux (daha yeni, aktif olarak bakılıyorlar). Byobu bu sistemlerin üzerinde çalışabilen ve ek ubuntu durum bilgisi sunan bir ön uç. Yeni kurulumlarda, tmux'u arka uç olarak kullanacak, eğer daha eski bir byobu kurulumuna sahipseniz ve mevcut bir konfigürasyon önceki ekrana bakacak olursa, ister ekran ister tmux olsun.

Byobu

Byobu, Debian tabanlı bir makinede bunu yaparak bilgisayara kurulabilir:

sudo aptitude install byobu

Yum kullanarak

su -c 'yum install byobu'

Byobu'yu diğer dağıtımlara kurmak da mümkündür.

Byobu kullanımı

Byobu komutunu byobussh kullanarak bağlandıktan sonra ana bilgisayarda çalıştırarak başlatabilirsiniz . Bu size şöyle görünen bir kabuk verecektir:

görüntü byobu

Ayrıca Byobu Terminalini -X seçeneğine sahip bir Ubuntu makinede kullanabilir ve kolayca çalışabilen bir byobu kullanabilirsiniz.

Kullanımı:

Yazarak byobu başlatın byobu.

Geçerli oturumda yeni bir pencere oluşturmak için F2 tuşuna, çeşitli pencereler arasında geçiş yapmak için F3-F4 tuşlarına basabilirsiniz.

Byobu'nun en iyi yanı, terminalden ayrılmak için terminalde çalışan işlemleri gerçekten öldürmek zorunda olmamanızdır. Basitçe ekrana / tmux'a (byobu'nun iskeleti) gönderebilir ve bir dahaki sefere devam edebilirsiniz:

  • Bybubu'dan ayrılmak ve çalışır durumda kalmasını sağlamak (ayırmak için) F6 tuşuna basın.
  • Gelecek sefere, sadece yap byobuve bulunduğun yere geri dönmelisin.

    byobu-detach-iliştirmek

Ayrıca byobu -S session1ve benzeri çeşitli byobu oturumları oluşturabilirsiniz . Ve geri döndüğünüzde ikisine de bağlanabilirsiniz.

Byobu kullanarak çok daha fazlasını yapabilirsiniz. Kullanın! Bazı kesin kılavuzlar burada veya burada .


PuTTY tabanlı bir oturumdan Ubuntu kutuma kadar byobu kullanmaya çalıştım, fakat durum satırının tekrarlanıp ekranda görünmesini sağladım. F6'ya basıldığında düzgün bir şekilde kopmasına rağmen kurulumumda kullanışlı bir çözüm değildi.
jfmessier

1
@jfmessier Çünkü PuTTY, ncurses (utf-8 temelde) iyi almıyor. Bu konuyu bu konuyu takip ederek ortadan kaldırmak mümkündür - stackoverflow.com/questions/10731099/…
SiddharthaRT

Bu harika! 1. bana benim varsayılan kabuk ve ben aynı anda 2 Bot çalıştıran almak ve 2. olarak bash ile etkinleştirmek için zorlandığım bir renkli bash istemi verir hala üzerinde çalışma yapmak için başka bir terminali var! @SiddharthaRT Bir oy hakkını hakediyorsunuz efendim!
Dev,

18

İşlem başladıktan sonra bunu yapamazsınız, uzun süren bir işi yapmadan önce bir şeyler ayarlamanız gerekir.

Nohup kullanabilirsiniz, ancak modern bilgelik giriş yaptığınız için ekranı veya byobu kullanmanızı önerir, böylece işleri koparabilir ve bırakabilirsiniz.

Ekran, bir makineden ayırabilir ve çalışma gününün sonundan uzun süren uzun süren işlemleri kontrol etmek istiyorsanız kullanışlı olan başka bir makineye yeniden bağlayabilme avantajına sahiptir.

Burada taramak için makul bir başlangıç kılavuzu var.

byobu menüler vb. ile ekranın üst kısmına kullanımı kolay bir arayüz koyar. Yeni bir F3 / F4 terminali başlatmak için F2, ileri geri geçiş yapmak ve F6'nın bağlantısını kesmek için. Gerçekten terminalleri kalıcı olarak sonlandırmak için exit yazın.


byobu bugünlerde tmux kullanıyor ..
12'de

12
“İşlem başladıktan sonra bunu yapamazsınız, uzun süren bir işi çalıştırmadan önce bir şeyler ayarlamanız gerekir.” - hayır, bunu disownbaşarmak için kullanabilirsiniz . @ Bassgey'in cevabını görün
Rich

1
ekran ve tmux öğrenmek için mücadele ettikten sonra .... byobu gözlerime gözyaşları getirdi
HDave

disownve sadece gerekirse Ctrl-z, o zaman bgaktif terminalden ve arka plandan elde etmek için. Öyleyse disown.
mimoralea

8

Hey, ekranın en etkili seçenek olduğuna karar verdim. Vncserver'ı kullanabilir ve ardından işlemi başlatabilirsiniz.

Ayrıca, tek müdahaleniz sürecin devam etmesi ve denetimin geri alınması gerekmiyorsa ve en önemlisi, oturumu kapatmanız gerekeceğinin ve işlemin zaten devam etmesinin farkında olmamanızdan çok daha önemliyse, kabuk olarak bash kullandın

Öncelikle Ctrl + Z yazıp ardından bg% 1 yazarak işlemi arka plana göndermeniz gerekir (sayı iş numarasına bağlıdır, genellikle 1'dir, ancak komut işlerini kullanarak listeyi kolayca çekebilirsiniz)

Sonunda emir komutunu çağırın (ardından jobid… bg komutunda olduğu gibi)

Bu, kabuğunuzla arka plandaki işlem arasındaki ebeveyn-çocuk ilişkisini kaldırarak kabuğunuzun sonlandırıldığı sırada ölmesini önler.


2
Bu cevap en iyisi! Neden herkes bahsediyor screen, soru giriş sonrası olayı, şimdi giriş yaptıktan sonra ve başlamadan önce işlemlerin nasıl devam ettirileceği olarak verildi. Harika cevap Jorge, bana gerçekten yardım ettin! :)
jwbensley

1
Basitçe bg(olmadan %1) çoğu zaman yeterlidir, çünkü varsayılan iş şu anki iş
Walter Tross

Kapsamlı bir cevaba sahip olmak güzel olurdu: Bir priori (önceden ayarlanmış): ascii terminal ekranı (eski), tmux (neewer); X pencereler: vnc (eski, hala korunan), xpra (daha yeni), xpra köksüzdür. Bir posterior (başladıktan sonra ısrarcı): ^ Z, reddetti, ... Ama bundan daha fazla etini çıkarmak için çok tembelim.
Krazy Glew

8

Uzun bir süredir çalıştığım tek bir kabuk betiği için oturum açacağım ve '&' kullanarak işlemi arka planda çalıştıracağım.

Örnek:

/path/to/my/script &

SSH oturumumu kapattım ve bağlantım kesildi. Bir süre sonra oturum açtığımda, komut dosyası, komut dosyasından sürekli veri toplamanın kanıtladığı gibi hala yürütülüyor.


3
Evet, screen / tmux'un bu basit çözümden daha iyi olduğunu bilmek isterim.
Mads Skjern

Evet, bunu ubuntularımda da görebiliyorum, fakat teoride olmamalı. Nedenini anlamıyorum
Daniel Pinyol

1
@MadsSkjern Çünkü bu yöntemi kullanarak komut dosyasına hiçbir girdi giremezsiniz.
Ken Sharp,

1
@MadsSkjern nedeni, eğer böyle bir işlemi çalıştırırsanız, oturumunuzu kapatıp &SSH oturumunuzda çalıştırırsanız , işlem hala devam eder, ancak işlemin çıktısını göremezsiniz (betiğiniz sizden bir şey çıkardıysa) görmeyecek, ancak eğer bir dosya
yazarsa

4

GNU Ekranını kontrol etmeli ve size yardımcı olup olmadığına bakmalısınız . Uygulamanın gerçek zamanlı olarak nasıl çalışması gerektiğine bağlı olarak, çözdüğünden daha fazla soruna neden olabilir, ancak en azından hiç bırakmamışsınız gibi oturumunuza devam etmenize izin verir.

Nasıl kullanılır :

  • screenİlk çalıştırma komutunu kullanın, giriş mesajlarını kaydırın, bir terminal vermeniz gerekir.
  • Ca Cc başka bir terminal açar
  • Ca Ck bir terminali öldürür
  • Terminallerde dolaşmak için Ca C-Space ve Ca C-Backspace kullanabilirsiniz.
  • Ca Ca, çoğunlukla sadece iki terminal kullanıyorsanız kullanışlıdır.
  • Ca Cd mevcut ekran oturumunu ayırır ve ekranlardan çıkar. Daha sonra screen -ro oturuma devam etmek için kullanabilirsiniz . Aynı anda birkaç ayrı ekran oturumunuz olabilir, bu durumda mevcut oturumların bir listesi görüntülenir.

Örneğin bölünmüş ekranlar gibi başka birçok seçenek vardır ve tüm kısayollar tamamen özelleştirilebilirdir.


3

En basit cevap ...

ctrl + z çalışan programı askıya alır

"bg" arka planda çalışacak


5
Süreci reddetmeksizin ( disownveya benzeri bir şeyle nohup), bu genellikle süreci SSH oturumunun bitiminden sonra sürdürmez.
Eliah Kagan

3
Ubuntu sunucumda, varsayılan kurulum ile gerçekten çalışmaya devam ediyor!
Mads Skjern

3

En kolay yol komutunuzu arka planda çalıştırmaktır &. O zaman sadece yaz:

disown -a

0

Herkes kullanmaya disownbaşladığını söylese de (işlemi başlattıktan sonra sahip olduğunuz tek seçenek), nohuphatta komutu çalıştırıyorsanız, komuttaki screentüm çıktıyı görmek istiyorsanız kullanışlıdır ... screen.. Hala Linux'un en yaygın ana dağıtımlarını denedim ve işi sadece arkaplana koymak ve istifa etmek, çalışan tüm süreçlerin ölmesine neden olmuyor. Küresel bir ortam ya da bir şey olmalı. Bunu bazı eski sistemlerde (slackware 12) deniyorum ve test komut dosyam el ile öldürene kadar çalışmaya devam ediyor:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Ben kabul ederken o screenbenim komut dosyalarını ya da her neyse .. ben kullanmaya hiç gerek olmadı günlüğe yazdım bile, bu çalıştırmak için en iyi yol olacağını disown -a ya nohupda tam paranoya dışında olduğu sürece. Belki birileri bash'ın varsayılan olarak nasıl davrandığına ışık tutabilir? Belki de bazı sistem yöneticileri, kullanıcılarının işlemlerinin sistemi aşırı yüklemesini engellemek için varsayılan olarak büyük mermilerde değişiklik yapıyor?


Başka bir sorunuz varsa lütfen yeni bir soru
heemayl

0

Ne yazık ki, sonlandırılmış bir SSH oturumu smokin veya ekranın ölmesine neden olabilir. Bunun nedeni systemd, oturumdan çıktıktan sonra tüm alt işlemlerini sonlandıracağıdır.

Bu ayarı logind.conf( /etc/systemd/logind.conf) öğesinden değiştirebilirsiniz :

KillUserProcesses=no

Https://unix.stackexchange.com/questions/490267 adresindeki cevabınız için teşekkürler .


-1

Onun yerine :

cmd options; 

Önce ekle nohup:

nohup cmd options & 

Ardından, konsol stdout'unu aşağıdakiler aracılığıyla görebileceksiniz:

tail -f nohup.out
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.