Bagaimana cara memasang kembali ke sesi mosh terpisah?

157

Bagaimana cara menyambungkan kembali ke sesi mosh terpisah atau menyingkirkan

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

yaitu apa yang setara dengan mosh

screen -D -R

atau mungkin

screen -wipe

Selanjutnya, di mana jawaban ini dapat ditemukan dalam dokumentasi?

John Baber-Lucero
sumber

Jawaban:

197

Untuk alasan keamanan, Anda tidak dapat memasang kembali, lihat https://github.com/keithw/mosh/issues/394

Untuk membunuh sesi terpisah, gunakan nomor PID yang ditampilkan dalam pesan itu (itulah bagian 'XXXX'.) Misalnya, jika Anda melihat -

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

Dan dapat menjalankan perintah ini:

kill 12345

Juga, untuk menutup semua koneksi mosh Anda dapat:

kill `pidof mosh-server`

Perhatikan bahwa jika Anda saat ini terhubung melalui mosh, perintah terakhir ini juga akan memutuskan Anda.

varta
sumber
34
@artfulrobot Karena ada kemungkinan sesi terpisah milik mosh-client yang masih hidup di suatu tempat. Sesi Mosh berkeliaran dan dapat bertahan hidup melalui siklus penangguhan / melanjutkan (misalnya, "Hibernasi"). Masalahnya, mosh tidak (dan tidak bisa dengan mudah) menyelesaikannya mendeteksi bahwa mesin klien dihidupkan ulang tanpa menutup sesi mosh dengan anggun.
binki
7
Apakah ada alasan untuk tidak melakukannya killall mosh-server? Terutama karena pidof dan killall benar-benar hal yang sama.
Jordan
6
@ Jordan: Pada beberapa sistem (Solaris, misalnya), killallmelakukan persis seperti yang dikatakan.
Dijeda sampai pemberitahuan lebih lanjut.
4
Jika Anda terhubung melalui mosh dan Anda menjalankan killall mosh-serverAnda akan terputus.
0xcaff
1
@ 0xcaff jika Anda terhubung melalui mosh dan menjalankan kill `pidof mosh-server`Anda akan terlepas sama saja
David
26

Yang mengejutkan saya, saya menggunakan CRIU ( https://criu.org ) untuk memeriksa dan me-restart klien mosh dan berhasil.

Mengejutkan.

Temukan PID mosh-klien Anda:

$ ps -ef | ya ampun

Kemudian, instal CRIU sesuai dengan instruksi mereka.

Kemudian, periksa seperti ini:

pos pemeriksaan $ mkdir

$ sudo ./criu dump -D pos pemeriksaan -t PID --shell-job

Kemudian, kembalikan:

$ sudo ./criu mengembalikan -D pos pemeriksaan --shell-job

Dan itu dia. Klien mosh Anda kembali.

Namun satu hal yang perlu diperhatikan adalah bahwa jika laptop Anda reboot (yang merupakan inti dari apa yang kami coba lindungi), mosh menggunakan monotonicjam untuk melacak waktu di sisi klien, yang tidak berfungsi di seluruh reboot. Namun, ini TIDAK akan berfungsi, jika laptop Anda hanya crash, itu tidak akan berfungsi karena nomor urut mosh akan tidak sinkron dengan versi yang diperiksa (biner akan dilanjutkan, tetapi komunikasi akan berhenti).

Untuk memperbaikinya, Anda harus memberi tahu mosh untuk berhenti melakukan itu dan mengunduh kode sumber mosh. Kemudian, edit file ini:

cd mosh

vim configure.ac

Kemudian, cari GETTIMEdan komentari baris itu.

Kemudian lakukan:

autoreconf # atau ./autogen.sh jika Anda baru saja mengkloningnya untuk pertama kali

./configure

membuat

buat instal

Setelah itu, sesi klien mosh Anda yang diperiksa CRIU akan selamat dari reboot.

(Jelas Anda harus menulis sesuatu untuk melakukan pos pemeriksaan secara teratur agar bermanfaat. Tapi, itu latihan untuk pembaca).

Michael Galaxy
sumber
1
Pastikan untuk mengetik 'CTRL-L' untuk menyegarkan output layar setelah pemulihan.
Michael Galaxy
6
Karena penasaran, apakah ada manfaat praktis untuk memulihkan sesi mosh client yang saya lewatkan? Saya menjalankan tmux pada mosh dan dapat meluncurkan kembali mosh pada klien dan menyambungkan kembali tmux ... adakah manfaat melakukan hal ini selain yang keren (yang sebenarnya benar-benar!)?
eskhool
1
Jawaban panjangnya: github.com/mobile-shell/mosh/issues/394 Jawaban singkatnya adalah, ya: Seseorang seharusnya tidak memerlukan sesi tmux jika daemon mosh-server sudah berjalan di server target. Ini tidak hanya membuat daemon mosh yang menggantung tergeletak di sekitarnya, tetapi juga dengan penekanan tombol yang tidak harus kita ketik di tempat pertama.
Michael Galaxy
1
Mosh adalah pengganti (dalam beberapa kasus) untuk SSH, bukan untuk layar. quoth keithw (penulis mosh) di github
törzsmókus
19

Saya menyadari ini adalah posting lama, tetapi ada solusi yang sangat sederhana untuk ini, seperti yang disarankan oleh Keith Winstein, penulis mosh, di sini: https://github.com/mobile-shell/mosh/issues/394

"Yah, pertama-tama, jika Anda ingin kemampuan untuk melampirkan ke sesi dari beberapa klien (atau setelah klien meninggal), Anda harus menggunakan layar atau tmux. Mosh adalah pengganti (dalam beberapa kasus) untuk SSH, bukan untuk layar. Banyak pengguna Mosh menggunakannya bersama dengan layar dan menyukainya seperti itu. "

Skenario: Saya masuk ke server jauh melalui mosh. Saya kemudian menjalankan layar dan memiliki proses yang berjalan di sesi layar, htop, misalnya. Saya kehilangan koneksi (baterai laptop mati, kehilangan koneksi jaringan, dll). Saya terhubung lagi melalui mosh dan mendapatkan pesan itu di server,

Mosh: Anda memiliki sesi Mosh yang terpisah di server ini (mosh [XXXX]).

Yang harus saya lakukan adalah membunuh sesi mosh sebelumnya

bunuh XXXX

dan pasang kembali ke sesi layar, yang masih ada .

layar -r

Sekarang, htop (atau proses apa pun yang berjalan) kembali seperti sebelumnya tanpa gangguan. Hal ini sangat berguna untuk menjalankan pemutakhiran atau proses lain yang akan membuat server dalam keadaan berantakan dan tidak dikenal jika tiba-tiba terganggu. Saya berasumsi Anda dapat melakukan hal yang sama dengan tmux, meskipun saya belum mencobanya. Saya percaya inilah yang disarankan oleh Annihilannic dan eskhool.

007
sumber
2
Ini jawaban yang bagus. Terima kasih, dan ya saya mengkonfirmasi bahwa itu berfungsi sama dengan tmux.
laughing_man
10

Sebagai tambahan untuk jawaban Varta, saya menggunakan perintah berikut untuk menutup semua koneksi mosh kecuali yang sekarang:

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

Alexander Burmak
sumber
Jika tidak ada sesi mosh lama, xkill akan melempar kesalahan. Penggunaan yang lebih baikpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77
4

Seperti @varta tunjukkan, pemilik mosh sangat menentang pemasangan kembali dari klien yang berbeda untuk alasan keamanan. Jadi, jika klien Anda pergi (misalnya Anda me-restart laptop Anda) satu-satunya pilihan Anda adalah untuk mematikan sesi.

Untuk membunuh hanya sesi terpisah, Anda dapat menggunakan baris berikut (yang saya miliki sebagai alias di saya .bashrc).

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

Perintah itu tergantung pada fakta bahwa whodaftar pengguna yang terhubung termasuk sesi mosh, hanya sesi mosh terlampir memiliki "via mosh", dan bahwa sesi mosh memiliki pid dalam tanda kurung siku. Jadi ia menemukan pids hanya untuk sesi mosh terpisah dan melewati mereka untuk membunuh menggunakan xargs.

Berikut ini adalah contoh whohasil untuk referensi:

$ 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)

Alternatifnya adalah menggunakan variabel lingkungan mosh-server MOSH_SERVER_SIGNAL_TMOUT. Anda dapat mengaturnya untuk sesuatu seperti 300 di Anda .bashrcpada sisi server . Kemudian jika Anda melakukan pkill -SIGUSER1 mosh-serveritu hanya akan membunuh mosh-server yang belum terhubung dalam 300 detik terakhir (yang lain akan mengabaikan SIGUSER1). Info lebih lanjut di halaman manual mosh-server . Saya menggunakan perintah di atas karena, setelah alias, sepertinya lebih mudah bagi saya.

Catatan, seperti yang disebutkan oleh @Annihilannic, jika Anda menggunakan tmux / layar di dalam sesi mosh Anda maka sesi tmux / layar tersebut masih ada setelah Anda membunuh sesi mosh. Jadi Anda masih bisa melampirkannya (jadi Anda benar-benar tidak kehilangan banyak dengan membunuh sesi mosh sendiri)

studgeek
sumber
3

Jawaban di sini mengklaim bahwa membunuh mosh-serveradalah satu-satunya pilihan yang sebagian besar sudah usang, karena kita dapat menggunakan criudan reptyrmemulihkan serta memasang kembali proses sewenang-wenang.

Belum lagi bahwa saat ini kita kill -USR1 mosh-serverhanya dapat membunuh sesi terpisah dengan cara yang bersih dan aman, tanpa menggunakan whooutput yang tidak aman atau perintah rumit untuk menghindari membunuh sesi kita sendiri.

Di sebelah criujawaban dari Michael R. Hines, ada sedikit lebih "ringan" reptyryang dapat digunakan untuk memasang kembali proses yang dimulai oleh mosh-server(yaitu bukan mosh-serveritu sendiri). Saya biasanya menggunakan

pstree -p <mosh-server PID>

untuk membuat daftar pohon proses di bawah mosh-server yang terpisah, dan kemudian

reptyr PID

untuk memasang kembali proses yang diinginkan ke terminal saya saat ini. Setelah mengulangi prosedur untuk semua proses yang saya pedulikan, saya

kill -USR1 <mosh-server PID>

sedangkan saya berhati-hati untuk hanya membunuh sesi yang saya tahu milik saya (sistem bersama).

Irfy
sumber
Saya mendapatkanUnable to attach to pid 10103: Permission denied
rubo77
-1

Gunakan perintah ps untuk mendapatkan daftar tugas yang sedang berjalan atau gunakan ps -ef | ya ampun

Bunuh mosh PID menggunakan perintah ini:

kill <pid>

Juga, untuk menutup semua koneksi mosh Anda dapat:

Perhatikan bahwa jika Anda saat ini terhubung melalui mosh, maka ini juga memutuskan Anda

kill `pidof mosh-server`
Pankaj Chauhan
sumber