it-swarm-tr.com

Ssh oturumunu sonlandırdıktan sonra işlemler nasıl devam eder?

Diyelim ki ssh oturumundan bir sürü işlem başlattım. Uzak makinede bu işlemleri sürdürürken ssh oturumunu sonlandırmak mümkün müdür?

636
Olivier Lalonde

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

tmux, birçok nedenden dolayı screen'den daha ü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 Shell'den kontrol edilebilir

Temel İşlevsellik

answer önerildiği gibi screen ile aynı işlevselliği elde etmek için aşağıdakileri yapmanız gerekir:

  • uzak makineye ssh
  • shell'e tmux yazarak tmux komutunu başlatın.
  • başlatılan tmux oturumunda istediğiniz işlemi başlatın
  • tmux oturumunu yazarak bırakın/ayırın Ctrl+b ve sonra d

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

Yan yana çalışan birden çok oturum yapmak istiyorsanız, her oturumu kullanarak adlandırmanız gerekir. Ctrl+b ve $. Halen çalışan oturumların bir listesini tmux list-sessions kullanarak alabilirsiniz, şimdi çalışan bir oturuma tmux attach-session -t 0 komutuyla ekleyin.

tmux, tek bir oturumdaki tek bir pencereyi ele almaktan çok daha gelişmiş şeyler yapabilir. Daha fazla bilgi için man tmux veya tmux GitHub sayfası bölümüne bakın. Özellikle, burada bir SSSscreen ile tmux arasındaki ana farklar hakkında.

737
tongpu

Seçenek 1: Nohup

En iyi yol genellikle en basittir.

Nohup long-running-command &

Özellikle bunun için yapıldı, stdout'u Nohup.log için bile kaydediyor.

man Nohup

Seçenek 2: bg

Zaten çalışan bazı görevlerin "arkaplanını" yapmak istiyorsanız, en iyi seçeneğiniz Ctrl+Z o zaman koş

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 disown, oturumu kapattıktan sonra işlemin devam etmesini sağlamalıdır.

screen ve diğerleri bunu yapabilir, ancak bunun için değil. Geride bırakacağınızı bildiğiniz görevler için Nohup ve zaten çalışmakta olduğunuz ve yeniden başlatmak istemediğiniz görevler için bg öneririz.

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

300
coteyr

Bunu screen kullanarak yapabilirsiniz.

Daha fazla bilgi edinmek veya bunu okumak için man screen yazın. ekran sayfası .

Basit senaryo:

  • uzak kutunuza ssh. screen yazın. Sonra istediğiniz işlemi başlatın.

  • Basın Ctrl-A sonra 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 dönmek istiyorsanız, tekrar oturum açın ve screen -r yazın. Bu, ekran oturumunuzu "devam ettirecek" ve işleminizin çıktısını görebilirsiniz.

203
Lincoln

Screen ve Nohup daha iyi bir yoldur, ancak zaten ekran olmadan çalışan bir işlemi veya Nohup'u kaldırmak zorunda kalırsanız, disown komutunu çalıştırabilirsiniz.

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

Seçenekler olmadan, her bir jobspec etkin iş tablosundan kaldırın. -h seçeneği verilirse, iş tablodan kaldırılmaz, ancak Shell bir SIGHUP alırsa SIGHUP işe gönderilmeyecek şekilde işaretlenir. jobspec mevcut değilse ve ne -a ne de -r seçeneği belirtilmezse, geçerli iş kullanılır. Hayır jobspec belirtilirse, -a seçeneği tüm işleri kaldırmak veya işaretlemek anlamına gelir; -r seçeneği jobspec bağımsız değişkeni olmadan çalışan işleri sınırlandırır.

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

83
bassgey

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şlemi iptal etmenizi sağlar.** İşlerin listesini almak için, önce jobs _ yazın.


** Yıkılma ile ilgili olarak (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.
52
Chaos

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ızlar. Görünüşe göre şu anda aktif olarak geliştiriliyor ) ve tmux (daha yeni, aktif olarak bakılıyor). 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ı

Ssh kullanarak bağlandıktan sonra ana makinede byobu komutunu kullanarak byobu uygulamasını başlatabilirsiniz. Bu size şöyle görünen bir Shell verecek:

image-byobu

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

Kullanımı:

Byobu ile byobu yazarak başlayın.

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:

  • Byobu'dan ayrılıp çalışmasını sağlamak (ayırmak) F6 tuşuna basın.
  • Bir dahaki sefere geldiğinde, sadece byobu yapın ve olduğunuz yere geri dönmelisiniz.

    byobu-detach-attach

Ayrıca, çeşitli byobu oturumları byobu -S session1 vb. İle 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 veya burada .

21
SiddharthaRT

İş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 gibi ekran veya byobu kullanmanızı önerir, böylece işleri ayırabilir ve bırakabilirsiniz.

Ekran, bir makineden ayırabilir ve çalışma gününün sonundan daha 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 makul bir başlangıç ​​ ekran kılavuz var.

byob , menüleri vb. ekranın üst kısmına kolay kullanımlı 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.

18
Richard Holloway

Uzun bir süredir çalıştığım tek bir Shell betiği için oturum açacağım ve işlemi '&' kullanarak 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.

8
user108430

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, Shell'i 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, Shell'iniz ile arka plandaki işlem arasındaki ebeveyn-çocuk ilişkisini kaldıracak ve Shell'iniz sona erdiğinde ölmesini önleyecektir.

8
Jorge Gutierrez

Kontrol etmelisin GNU Screen ve sana yardım edip etmediğini gör. 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 :

  • İlk başlangıç ​​için screen komutunu kullanın, giriş mesajlarını kaydırın, bir terminale yönlendirilmelisiniz.
  • C-a C-c başka bir terminal açar
  • C-a C-k bir terminali öldürür
  • Terminaller arasında geçiş yapmak için C-a C-Boşluğu ve C-a C-Boşluğu kullanabilirsiniz
  • C-a C-a çoğunlukla iki terminal kullanıyorsanız kullanışlıdır
  • C-a C-d geçerli ekran oturumunu ayırır ve ekranlardan çıkar. Daha sonra o oturumu devam ettirmek için screen -r 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.

4
T. Verron

En basit cevap ...

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

"bg" arka planda çalışacak

3
Roop

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

disown -a
3
Zibri

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şlemleri sonlandıracaktır.

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

KillUserProcesses=no

Cevabınız için teşekkürler https://unix.stackexchange.com/questions/490267 .

0
Jonathan

Herkes disown (işlemi başlattıktan sonra sahip olduğunuz tek seçenek), Nohup, hatta komutu komutun tüm çıktısını görmek istemeniz durumunda kullanabileceğiniz faydalı olan screen'de kullanmanız gerektiğini söylese de ... screen hayranıyım .. Linux'un en yaygın mainstream dağıtımlarını hala denedim ve sadece işi arkaplana koymak ve işten çıkmak tüm çalışanların ö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$ 

Her ne kadar screen öğesinin bu dosyayı çalıştırmanın en iyi yolu olacağı konusunda hemfikir olmama rağmen, komut dosyam günlük dosyalarına yazdıysam veya herhangi bir şekilde yazdıysa bile .. Paranomun tamamen dışında olmadığı sürece disown -a veya Nohup kullanmaya hiç ihtiyacım olmadı. 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?

0
Dan Gullage