ssh bağlantısı kesilirken tmux oturumu öldürüldü


23

Özet : ssh bağlantısını kestiğimde tmux oturumumun neden öldüğünü anlamaya çalışıyorum

Ayrıntılar :

Arch Linux sisteminde tmux yüklü. Bir tmux oturumu başlattığımda, ssh oturumu etkin durumdayken ondan ayrılıp tekrar ekleyebilirim. Ama eğer ssh oturumumu bitirirsem tmux oturumu öldürülür.

Ssh oturumu sonlandırılsa bile tmux oturumunun çalışmaya devam ettiği başka bir sistemim olduğu için bu normal bir davranış olmadığını biliyorum ve yeni bir ssh bağlantısı kurduktan sonra tmux oturumuna ekleyebilirsiniz. Bir sorunu olan ve doğru çalışan bir sistem çok benzer yapılandırmalara sahiptir, bu yüzden ne kontrol edeceğimi bilmiyorum.

Tmux sürüm 1.9a kullanıyorum. (Kök erişimine sahip olduğum) problemi olan sistemin Linux çekirdek sürümü 3.17.4-1 ve doğru çalışan sistemin çekirdek sürümü 3.16.4-1-ARCH (bunun üzerinde kök yok) sistem). Çekirdek versiyonunun sorunun kaynağı olduğuna şüphe ediyorum, bu fark ettiğim tek bir fark.

Herkesin benzer bir problem görüp görmediğini ve olası bir çözümü bilip bilmediğini görmek isteyeceğimi düşündüm.

Soruna yol açan kesin adımlar şunlardır:

  1. ssh makineye
  2. tmuxtmux'u başlatmak için koş
  3. ctrl-B D ayırmak için (bu noktada tmux attach
  4. ssh oturumu kapat (bu noktada tmux oturumu öldürüldü, farklı bir terminalde root olarak giriş yaptığımda bunu gözlemleyebildim)
  5. ssh ile yeniden bağlanın ve çalıştırın tmux attachve mesajı alıyorum no sessionsve çalışan tmux lsdöner failed to connect to server: Connection refused. Bu mantıklı çünkü servis çalışmıyor. Bana mantıklı gelmeyen şey, ssh oturumundan ayrıldığımda neden 4. adımda öldürüleceğidir.

strace verileri:

Yorumlardan birine yanıt olarak, tmux sunucu işleminin hangi sistemleri çağırdığını görmek için strace kullandım. SSH oturumumdan çıktığımda (yazarak exitveya ile ctrl-d) tmux işleminin öldürüldüğüne benziyor . Burada, strace çıktısının son kısmının bir parçacığı var.

poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0)         = 1
+++ killed by SIGKILL +++

Bunu tmux'un düzgün çalıştığı farklı bir sistemle karşılaştırdım ve bu sistemde ben çıktıktan sonra bile tmux işlemi devam ediyor. Ben kök neden ssh oturumu kapattığınızda tmux işlemi sonlandırılıyor gibi görünüyor. Nedenini bulmak için bu sorunu gidermek için biraz zaman harcamam gerekecek, ancak strace önerisinin yararlı olması nedeniyle sorumu güncelleyeceğimi düşündüm.


emin olmak için lütfen adım adım açıklayın: Ben ssh varsayalım, bir tmux oturumu başlatmak, oturumdan ayırmak ve sş kapatın: tekrar ssh, tmix oturumuna yeniden katılmak için herhangi bir yolu yok mu? yani, oturum artık çalışmıyor?
Olivier Dulac

@OlivierDulac evet varsayımınız doğru. Ayrıca sorumu bu detayları içerecek şekilde düzenledim.
Gabriel Southern

ssh oturumunu nasıl kapatıyorsunuz? ve bunu bir şey alırsa sen (bir dosyaya, çok ayrıntılı yönlendirme) SSH bağlantısı kapattığınızda görmek için, sshd PID'sine tmux bir pid ve başka bir strace eklemenizi
Olivier Dulac

@OlivierDulac öneriniz için teşekkürler. Soruyu strace'den gelen bilgilerle güncelledim. Ben ssh oturumu sona erdiğinde tmux sunucu işlemi öldürülüyor gibi görünüyor. Bunun olması gerektiğini sanmıyorum, bu yüzden neden olduğunu anlamaya ihtiyacım var.
Gabriel Southern

Ayrıntılı günlük kaydı etkinken tmux'u başlatın ve bağlantıyı kestiğinizde günlüğe bir şey yazdırılıp yazdırılmadığına bakın. Ayrıca, uzak makinedeki tmux'un içindeki ve dışındaki TERM nedir?
jasonwryan

Yanıtlar:


16

teori

Systemd dahil olmak üzere bazı init sistemleri, hizmete ait tüm işlemleri öldürme özelliği sağlar. Hizmet genellikle çatalla daha fazla işlem oluşturan ve bu işlemler de bunu yapabilen tek bir işlem başlatır. Tüm bu işlemler tipik olarak hizmetin bir parçası olarak kabul edilir. Systemd'de bu, cgroups kullanılarak yapılır .

Systemd'de, hizmet varsayılan olarak durdurulduğunda bir hizmete ait tüm işlemler öldürülür. SSH sunucusu açıkça hizmetin bir parçasıdır. Sunucuya bağlandığınızda, SSH sunucusu genellikle çatallanır ve yeni işlem SSH oturumunuzu işler. SSH oturum işleminden veya alt öğelerinden çatallayarak , ekranınız veya tmux'unuz dahil olmak üzere diğer sunucu tarafı işlemleri başlatılır .

Killmode ve soket aktivasyonu

Varsayılan davranış, KillModeyönerge kullanılarak değiştirilebilir . Akış yukarı proje AFAIK herhangi bir .servicedosya içermez ve bu nedenle dağıtımlara göre değişir. Sisteminizde SSH'yi etkinleştirmenin genellikle iki yolu vardır. Birincisi, ssh.serviceağ üzerinde uzun süredir çalışan bir SSH artalan sürecini koruyan klasiktir . Tarafından ele soket aktivasyonu yoluyla diğer is ssh.socketo dönüş başlar sshd@.servicesadece tek bir SSH oturumu için çalışır.

Çözümler

İşlemler oturumun sonunda öldürülürse, soket etkinleştirme kullanıyor olabilirsiniz ve SSH oturum işleminin sonlandığını fark ettiğinde sistemd tarafından öldürülür. Bu durumda iki çözüm vardır. Bunlardan biri ssh.serviceyerine kullanarak soket aktivasyonunu kullanmaktan kaçınmaktır ssh.socket. Diğer ayarlamaktır KillMode=processiçinde Servicebölümüne ssh@.service.

KillMode=processAyar ayrıca klasik ile yararlı olabilir ssh.serviceo SSH oturumu süreci veya öldürme kaçınır gibi ekranı ya tmux sunucusu durduruldu veya yeniden alır süreçleri.

Gelecek Notlar

Bu cevap belli ki popülerlik kazandı. OP için çalışırken, sistemd-logind geliştirme veya yapılandırma nedeniyle gelecekte bir kişi için çalışmayabilir . Bu yanıttaki açıklamadan farklı bir davranışla karşılaşırsanız lütfen oturum açma oturumlarıyla ilgili belgeleri kontrol edin.


Downvoter'dan herhangi bir geri bildirim veya sadece trolling?
Pavel Šimerda

3
Detaylı cevap için teşekkürler. Sshd.service konumuna geçmek sorunu çözdü.
Gabriel Güney

Bu sorunu initdaha ziyade kullanan bir sistemde yaşıyorum systemd. Ama yine de biraz farklı, soruma bakın .
gerrit

5

SSH için soket etkinleştirmeli systemd kullanıyor musunuz?

Eğer öyleyse, bununla ilgili bilinen bir sorun var . Systemd destekçilerine göre, bu aslında bir özelliktir - systemd, oturum sona erdiğinde bir oturum tarafından ortaya çıkan tüm işlemleri öldürür. (Ben yararlı olmak olduğunu görüyoruz, ama GNU içinde olabilir screen, ya da tmux, kesinlikle, dava yok olduğunu ☺ veya kullanıcılar tabii ki, arka plan işlemleri çalıştırabilir diğer birçok durumlarda istiyorum.)

Eğer öyleyse, geçiş deneyin sshd.socketiçinsshd.service .


1
Kullanıcılarınızın oturumu kapattıktan sonra çalışan işlemleri çalıştırmasına izin verilirse genellikle bu özelliği SSH girişleri için kullanmak istemediğinizi söyleyebilirim. Bu, ekrana veya tmux'a özgü değil, SSH'ye (sunucu tarafında arka plan işlemleri varsa) özgüdür.
Pavel Šimerda

2
@ PavelŠimerda evet, bunu örtük düşündüm, ancak şimdi daha açık hale getirmek için yayını düzenledim.
mirabilos

3

Ubuntu 16.04 (kde neon) üzerinde tmux ve ekran ile aynı sorunu yaşıyordum. Ssh oturumunun bağlantısı kesildiğinde ekran / tmux sonlandırıldı.

uzun öykü kısa, systemd varsayılan ayarlarını killuserprocess = yes olarak değiştirdi, bu nedenle ssh oturumundan çıktıktan sonra oluşturduğu her işlem sonlandırılacak.

Bu komutu kullanarak kolay düzeltme (saatlerce denedikten sonra) screen / tmux'u çalıştırın

Ekran için

systemd-run --scope --user screen

Tmux için

systemd-run --scope --user tmux

Daha kolay hale getirmek için bir takma ad oluşturabilirsiniz

alias tmux= "systemd-run --scope --user tmux"


-bash: systemd-run: command not foundüzerinde Red Hat Enterprise Linux Server release 6.8 (Santiago).
gerrit

Kök olmadığında bu işe yarıyor mu?
gerrit

1
Istenmeyen tmux / ekran öldürme davranışının sadece 16.04 Ubuntu 18.04 LTS'de gerçekleşmediğini fark ettim.
Seth

2

Hareket gerektirmeyen bu diğer çözüm, sshd.socketiçin sshd.service, başlamaktır tmuxbir systemd hizmet [0] olarak sunucu. Bu şekilde, tmuxSSH'deki tmuxkomut tarafından ortaya çıkmak yerine SSH'yi sunucuya girdiğinizde sunucu zaten çalışıyor demektir , böylece öldürülmeyecektir.

[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd


Kök olmadığında bu işe yarıyor mu?
gerrit

Evet, bu geçerli bir çözüm. Ancak yine de SSH oturumu üzerinden SSH hizmetini yeniden başlatmakla davayı çözmek istiyorsunuz. :)
Pavel Šimerda

Çocuklar, OpenRC kullanmanız durumunda , ArchWiki
Megver83'te

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.