Ayrılmış bir mosh oturumuna nasıl yeniden bağlanırım?


157

Müstakil bir mosh oturumuna nasıl yeniden bağlanırım veya başka türlü nasıl kurtulurum

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

mosh eşdeğeri nedir

screen -D -R

veya muhtemelen

screen -wipe

Ayrıca, bu cevap belgelerde nerede bulunabilir?

Yanıtlar:


197

Güvenlik nedeniyle yeniden bağlayamazsınız, bkz. Https://github.com/keithw/mosh/issues/394

Ayrılmış oturumu öldürmek için, o mesajda görüntülenen PID numarasını kullanın ('XXXX' bölümüdür.) Örneğin,

Mosh: You have a detached Mosh session on this server (mosh [12345]).

Ve bu komutu çalıştırabilir:

kill 12345

Ayrıca, tüm yosun bağlantılarını kapatmak için şunları yapabilirsiniz:

kill `pidof mosh-server`

Şu anda mosh üzerinden bağlıysanız, bu son komutun da bağlantısının kesileceğini unutmayın.


34
@artfulrobot Çünkü ayrılmış oturumun hala bir yerde yaşayan bir mosh istemcisine ait olma ihtimali var. Mosh oturumları dolaşır ve askıya alma / devam ettirme (örn., “Hazırda Bekletme”) döngüsünden sonra hayatta kalabilir. Mosh'ın çözemediği (ve kolayca yapamadığı) problem, mosh oturumunu zarif bir şekilde kapatmadan istemci makinenin yeniden başlatıldığını tespit etmektir.
binki

7
killall mosh-serverBunun yerine olmamak için bir neden var mı ? Özellikle pidof ve killall gerçekten aynı şey olduğundan.
Ürdün

6
@Jordan: Bazı sistemlerde (örneğin Solaris,) günü killallyaptığı tam olarak ne diyor.
sonraki duyuruya kadar duraklatıldı.

4
Eğer mosh üzerinden bağlıysanız ve koşarsanız killall mosh-serverbağlantınız kesilir.
0xcaff

1
@ 0xcaff Eğer mosh üzerinden bağlanırsanız ve koşarsanız kill `pidof mosh-server`aynı şekilde ayrılacaksınız
David

26

Şaşkınlığım için CRIU ( bir mosh istemcisini kontrol etmek ve yeniden başlatmak için https://criu.org ) kullandım ve işe yaradı.

Şok edici.

Mosh müşterinizin PID'sini bulun:

$ ps -ef | grep mosh

Ardından, CRIU'yu talimatlarına göre takın.

Ardından, bu şekilde kontrol edin:

$ mkdir kontrol noktası

$ sudo ./criu dökümü -D kontrol noktası -t PID - kabuk işi

Ardından geri yükleyin:

$ sudo ./criu restore -D denetim noktası - kabuk işi

Ve işte burada. Mosh müşteriniz geri döndü.

Bununla birlikte, dikkat edilmesi gereken bir şey, dizüstü bilgisayarınız yeniden başlatılırsa (bu, korumaya çalıştığımız şeyin bütün noktasıdır), monotonicmüşteri tarafından yeniden başlatıldığında çalışmayan saati izlemek için bir saat kullanır . Bu işe yaramaz, ancak dizüstü bilgisayarınız sadece düz çökerse işe yaramaz çünkü mosh sıra numaraları kontrol işaretli sürümle senkronize olmayacaktır (ikili devam edecektir, ancak iletişim duracaktır).

Bunu düzeltmek için, mosh'a bunu yapmayı bırakmasını ve mosh kaynak kodunu indirmesini söylemeniz gerekir. Ardından, bu dosyayı düzenleyin:

cd mosh

vim configure.ac

Ardından, GETTIMEbu satırı arayın ve yorum yapın.

Sonra şunları yapın:

ilk kez klonladıysanız autoreconf # veya ./autogen.sh

./yapılandır

Yapmak

kurulum yap

Bundan sonra, CRIU tarafından kontrol edilen mosh istemci oturumlarınız yeniden başlatılır.

(Açıkçası, kontrol noktalarını faydalı olacak kadar düzenli olarak gerçekleştirmek için bir şeyler yazmanız gerekir. Ancak, bu okuyucu için bir egzersizdir).


1
Geri yükledikten sonra ekran çıktısını yenilemek için 'CTRL-L' yazdığınızdan emin olun.
Michael Galaxy

6
Gerçek bir meraktan, eksik olduğum mosh istemci oturumunu geri yüklemenin pratik bir yararı var mı? Ben mosh üzerinde tmux çalıştırın ve sadece müşteri üzerinde mosh yeniden ve tmux yeniden bağlamak ... serin (bunu gerçekten gerçekten!) Dışında bunu yapmanın bir yararı var mı?
eskhool

1
Uzun cevap: github.com/mobile-shell/mosh/issues/394 Kısa cevap, evet: Eğer mosh-sunucu arka plan programı zaten hedef sunucuda çalışıyorsa tmux oturumuna ihtiyaç duyulmamalıdır. Sadece etrafta sarkan mizah cinleri bırakmakla kalmaz, aynı zamanda ilk başta yazmamız gerekmeyen bir başka tuş vuruşu seti.
Michael Galaxy

1
Mosh, ekranın değil, SSH'nin yerine geçer (bazı durumlarda). github üzerinde quoth keithw (mosh yazar)
törzsmókus

19

Bunun eski bir yazı olduğunu anlıyorum, ancak mosh yazarı Keith Winstein tarafından önerildiği gibi, bunun için çok basit bir çözüm var: https://github.com/mobile-shell/mosh/issues/394

"Öncelikle, birden fazla istemciden (veya istemci öldükten sonra) bir oturuma ekleme yapabilmek istiyorsanız, ekran veya tmux kullanmalısınız. Mosh, ekranın değil SSH'nin yerine geçer (bazı durumlarda). Birçok Mosh kullanıcısı ekranı ile birlikte kullanıyor ve bu şekilde beğeniyor. "

Senaryo: Uzaktaki bir sunucuya yosun ile giriş yaptım. Sonra ekran çalıştırmak ve örneğin htop, ekran oturumunda çalışan bir işlem var. Bağlantıyı kaybediyorum (dizüstü bilgisayar pili biter, ağ bağlantısını kaybeder vb.). Ben mosh ile tekrar bağlanır ve bu mesajı sunucuya alırım,

Mosh: Bu sunucuda müstakil bir Mosh oturumunuz var (mosh [XXXX]).

Tek yapmam gereken önceki mosh oturumunu öldürmek

XXXX'i öldür

ve hala var olan ekran oturumuna yeniden bağlanın .

ekran -r

Şimdi, htop (veya çalışmakta olan herhangi bir işlem), kesintisiz olarak olduğu gibi geri döndü.Bu, aniden kesintiye uğrarsa sunucuyu dağınık, bilinmeyen bir durumda bırakacak yükseltmeleri veya diğer işlemleri çalıştırmak için özellikle yararlıdır. Aynı şeyi tmux ile yapabileceğinizi varsayıyorum, ancak denemedim. İnanıyorum ki Annihilannic ve eskhool böyle bir şeydi.


2
Bu harika bir cevap. Teşekkür ederim ve evet tmux ile aynı şekilde çalıştığını doğruladım.
laughing_man

10

Varta'nın cevabına ek olarak, şu anki hariç tüm mosh bağlantılarını kapatmak için aşağıdaki komutu kullanıyorum:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill


Eski bir mosh oturumu yoksa, xkill bir hata atar. Daha İyi Kullanımpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
Rubo77

4

@Varta'nın işaret ettiği gibi, mosh sahipleri güvenlik nedenlerinden dolayı farklı müşterilerin yeniden bağlanmasına çok karşılar. Yani müşteriniz gitti ise (örneğin dizüstü bilgisayarınızı yeniden başlattıysanız) tek seçeneğiniz oturumları öldürmektir.

Sadece müstakil oturumları öldürmek için aşağıdaki satırı kullanabilirsiniz (ki bu benim takma adımdır .bashrc).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

Bu komut who, mosh oturumları dahil bağlı kullanıcıları listelemesine, yalnızca ekli mosh oturumlarına "mosh üzerinden" sahip olmasına ve mosh oturumlarının pidelerinin köşeli parantez içinde olmasına bağlıdır. Bu yüzden sadece müstakil mosh oturumları için pids bulur ve onları xargs kullanarak öldürmek için geçirir.

İşte bir örnek who referans için sonuç:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

Bir alternatif, mosh-server ortam değişkenini kullanmaktır MOSH_SERVER_SIGNAL_TMOUT. Sen Gözlerinde farklı 300 gibi bir sunucu ayarlayabilirsiniz .bashrcüzerinde sunucu tarafında . Sonra birpkill -SIGUSER1 mosh-server , yalnızca son 300 saniyede bağlanmamış mosh sunucularını öldürür (diğerleri SIGUSER1'i yok sayar). Mosh-server man sayfasında daha fazla bilgi . Yukarıdaki komutu kullanıyorum, çünkü bir kez aliased, benim için daha basit görünüyor.

@Annihilannic tarafından belirtildiği gibi, mosh oturumlarınızda tmux / screen kullanıyorsanız, mosh oturumlarını öldürdükten sonra bu tmux / ekran oturumlarının hala etrafta olduğunu unutmayın. Böylece onlara hala bağlayabilirsiniz (böylece mosh oturumlarını kendileri öldürerek gerçekten fazla kaybetmezsiniz).


3

Burada öldürmenin mosh-servertek seçenek olduğunu iddia eden cevaplar , keyfi süreçleri kullanabileceğimiz criuve reptyrgeri yükleyebildiğimiz için büyük ölçüde geçersizdir .

Bugünlerde yapabileceğimizden bahsetmiyorum bile kill -USR1 mosh-server , whokendi oturumumuzu öldürmekten kaçınmak için güvenli olmayan çıktılara veya hantal komutlara başvurmadan, müstakil oturumları sadece temiz ve güvenli bir şekilde öldürebileceğimizden .

Sonraki criuMichael R. Hines gelen cevap, biraz daha "hafif" var reptyrtarafından başlatılmış süreçleri yeniden bağlanması için kullanılabilir mosh-server(yani değil mosh-serverkendisi). Tipik olarak kullanıyorum

pstree -p <mosh-server PID>

işlem ağacını müstakil mosh-sunucusu altında listelemek ve

reptyr PID

istenen işlemi mevcut terminalime yeniden bağlamak için. Önem verdiğim tüm işlemler için prosedürü tekrarladıktan sonra,

kill -USR1 <mosh-server PID>

oysa sadece benim (paylaşılan sistem) olduğunu bildiğim oturumları öldürmeye özen gösteriyorum.


Ben olsunUnable to attach to pid 10103: Permission denied
rubo77

-1

Çalışan görevlerin listesini almak için ps komutunu kullanın veya kullanın ps -ef | grep mosh

Bu komutu kullanarak mosh PID'yi öldürün:

kill <pid>

Ayrıca, tüm yosun bağlantılarını kapatmak için şunları yapabilirsiniz:

Şu anda mosh ile bağlıysanız, bunun da bağlantısının kesildiğini unutmayın.

kill `pidof mosh-server`
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.