Sesi tmux terbunuh saat melepaskan dari ssh

23

Rangkuman : Saya mencoba mencari tahu mengapa sesi tmux saya mati ketika saya memutuskan sambungan dari ssh

Detail :

Saya telah menginstal tmux pada sistem Arch Linux. Ketika saya memulai sesi tmux saya dapat melepaskannya dan kemudian melampirkan lagi saat sesi ssh aktif. Tetapi jika saya mengakhiri sesi ssh saya maka sesi tmux terbunuh.

Saya tahu ini bukan perilaku normal karena saya memiliki sistem lain di mana sesi tmux terus berjalan bahkan jika sesi ssh berakhir dan saya dapat melampirkan ke sesi tmux setelah membuat koneksi ssh baru. Sistem yang memiliki masalah dan yang berfungsi dengan benar memiliki konfigurasi yang sangat mirip, jadi saya tidak yakin apa yang harus diperiksa.

Saya menjalankan tmux versi 1.9a. Sistem yang memiliki masalah (bahwa saya memiliki akses root untuk) memiliki versi kernel Linux 3.17.4-1 dan sistem yang berfungsi dengan benar memiliki versi kernel 3.16.4-1-ARCH (Saya tidak memiliki root pada itu sistem). Saya ragu bahwa versi kernel adalah sumber masalahnya, hanya satu perbedaan yang saya perhatikan.

Saya pikir saya akan bertanya untuk melihat apakah ada yang melihat masalah yang sama dan mengetahui kemungkinan solusi.

Langkah-langkah tepat yang mengarah ke masalah adalah:

  1. ssh ke mesin
  2. jalankan tmuxuntuk memulai tmux
  3. ctrl-B D untuk melepaskan (pada titik ini saya bisa bergabung kembali dengan tmux attach
  4. close ssh sesi (pada titik ini sesi tmux terbunuh, saya sudah bisa mengamati ini ketika saya login sebagai root di terminal yang berbeda)
  5. sambungkan kembali dengan ssh dan jalankan tmux attachdan saya mendapatkan pesan no sessionsdan menjalankan tmux lspengembalian failed to connect to server: Connection refused. Ini masuk akal karena servisnya tidak berjalan. Apa yang tidak masuk akal bagi saya adalah mengapa itu terbunuh pada langkah 4 ketika saya memutuskan sambungan dari sesi ssh.

data strace:

Menanggapi salah satu komentar saya menggunakan strace untuk melihat sistem apa yang membuat proses server tmux. Sepertinya ketika saya keluar dari sesi ssh saya (dengan mengetik exitatau dengan ctrl-d) bahwa proses tmux sedang terbunuh. Berikut potongan bagian akhir dari output strace.

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 +++

Saya membandingkan ini dengan sistem yang berbeda di mana tmux bekerja dengan baik dan pada sistem itu proses tmux terus berjalan bahkan setelah saya keluar. Jadi akar penyebabnya adalah bahwa proses tmux sedang dihentikan ketika saya menutup sesi ssh. Saya harus meluangkan waktu memecahkan masalah ini untuk mencari tahu mengapa, tapi saya pikir saya akan memperbarui pertanyaan saya karena saran strace berguna.

Gabriel Southern
sumber
untuk memastikan, tolong jelaskan langkah demi langkah: Saya menganggap Anda ssh, memulai sesi tmux, melepaskan diri dari sesi, dan menutup shh: ketika Anda ssh lagi, Anda tidak punya cara untuk bergabung kembali dengan sesi tmix? yaitu, sesi tidak lagi berjalan?
Olivier Dulac
@OlivierDulac ya anggapan Anda benar. Saya juga mengedit pertanyaan saya untuk memasukkan perincian ini.
Gabriel Southern
bagaimana Anda menutup sesi ssh? dan Anda bisa melampirkan strace ke pid dari tmux dan yang lain ke pid dari sshd, untuk melihat apakah ia menerima sesuatu ketika Anda menutup koneksi ssh (sangat verbose, mengarahkan ulang ke file)
Olivier Dulac
@OlivierDulac terima kasih atas sarannya. Saya telah memperbarui pertanyaan dengan info dari strace. Sepertinya proses server tmux terbunuh ketika saya mengakhiri sesi ssh. Saya tidak berpikir ini seharusnya terjadi, jadi saya perlu mencari tahu mengapa itu terjadi.
Gabriel Southern
Mulai tmux dengan logging verbose diaktifkan dan lihat apakah ada yang dicetak ke log ketika Anda memutuskan sambungan. Juga, apa TERM pada mesin remote masuk dan keluar dari tmux?
jasonwryan

Jawaban:

16

Teori

Beberapa sistem init termasuk systemd menyediakan fitur untuk membunuh semua proses milik layanan. Layanan ini biasanya memulai proses tunggal yang menciptakan lebih banyak proses dengan forking dan proses-proses tersebut dapat melakukannya juga. Semua proses tersebut biasanya dianggap bagian dari layanan. Dalam systemd ini dilakukan dengan menggunakan cgroup .

Di systemd, semua proses yang dimiliki oleh layanan terbunuh ketika layanan dihentikan secara default. Server SSH jelas merupakan bagian dari layanan. Ketika Anda terhubung ke server, server SSH biasanya bercabang dan proses baru menangani sesi SSH Anda. Dengan memalsukan dari proses sesi SSH atau anak-anaknya, proses sisi server lain dimulai, termasuk layar atau tmux Anda .

Aktivasi Killmode dan soket

Perilaku default dapat diubah menggunakan KillModearahan. Proyek hulu tidak AFAIK termasuk .servicefile apa pun dan itu berbeda berdasarkan distribusi. Biasanya ada dua cara untuk mengaktifkan SSH di sistem Anda. Salah satunya adalah klasik ssh.serviceyang mempertahankan daemon SSH yang berjalan lama mendengarkan di jaringan. Yang lain adalah melalui aktivasi soket yang ditangani oleh ssh.socketyang pada gilirannya dimulai [email protected]yang hanya berjalan untuk sesi SSH tunggal.

Solusi

Jika proses Anda terbunuh pada akhir sesi, ada kemungkinan bahwa Anda menggunakan aktivasi soket dan terbunuh oleh systemd ketika pemberitahuan bahwa proses sesi SSH keluar. Dalam hal ini ada dua solusi. Salah satunya adalah menghindari penggunaan aktivasi soket dengan menggunakan ssh.servicebukan ssh.socket. Yang lain adalah mengatur KillMode=processdi Servicebagian [email protected].

The KillMode=processPengaturan juga dapat berguna dengan klasik ssh.service, karena menghindari membunuh proses sesi SSH atau layar atau tmux proses ketika server akan dihentikan atau dimulai ulang.

Catatan masa depan

Jawaban ini rupanya memperoleh tingkat popularitas. Sementara itu bekerja untuk OP itu mungkin terjadi bahwa itu tidak bekerja untuk seseorang di masa depan karena pengembangan atau konfigurasi systemd-logind . Silakan periksa dokumentasi pada sesi logind jika Anda mengalami perilaku yang berbeda dari deskripsi dalam jawaban ini.

Pavel Šimerda
sumber
Adakah umpan balik khusus dari downvoter atau hanya trolling?
Pavel Šimerda
3
Terima kasih atas respon yang mendetail. Beralih ke sshd.service memperbaiki masalah.
Gabriel Southern
Saya mengalami masalah ini pada sistem menggunakan initdaripada systemd. Tapi ini sedikit berbeda, lihat pertanyaanku .
gerrit
5

Apakah Anda menggunakan systemd dengan aktivasi soket untuk SSH?

Jika demikian, ada masalah yang diketahui dengan itu . Menurut para pendukung systemd, ini sebenarnya adalah sebuah fitur - systemd membunuh semua proses yang dihasilkan oleh sebuah sesi ketika sesi berakhir. (Saya bisa melihat itu berguna, tetapi dalam GNU screen, atau tmux, jika Anda tidak menginginkannya ☺ atau dalam kebanyakan kasus lain di mana pengguna dapat menjalankan proses latar belakang, tentu saja.)

Jika demikian, coba beralih dari sshd.socketkesshd.service .

mirabilos
sumber
1
Saya akan mengatakan Anda umumnya tidak ingin menggunakan fitur itu untuk login SSH jika pengguna Anda diizinkan untuk menjalankan proses yang berjalan setelah keluar. Itu tidak khusus untuk layar atau tmux melainkan untuk SSH (dengan proses latar belakang di sisi server).
Pavel Šimerda
2
@ PavelŠimerda ya, saya pikir itu implisit, tetapi mengedit posting untuk membuatnya lebih eksplisit sekarang.
mirabilos
3

Saya mengalami masalah yang sama dengan tmux dan layar pada Ubuntu 16.04 (kde neon). Ketika sesi ssh terputus layar / tmux dihentikan.

Singkatnya, systemd mengubah pengaturan default menjadi killuserprocess = ya jadi setelah meninggalkan sesi ssh, setiap proses yang dibuat olehnya akan dihentikan.

Perbaiki mudah (setelah berjam-jam mencoba) jalankan layar / tmux menggunakan perintah ini

Untuk layar

systemd-run --scope --user screen

untuk Tmux

systemd-run --scope --user tmux

Anda dapat membuat alias untuk membuatnya lebih mudah

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

mrbarletta
sumber
-bash: systemd-run: command not foundpada Red Hat Enterprise Linux Server release 6.8 (Santiago).
gerrit
Apakah ini berfungsi ketika saya belum mendapatkan root?
gerrit
1
Saya perhatikan perilaku pembunuhan tmux / layar yang tidak diinginkan tidak terjadi pada Ubuntu 18.04 LTS, hanya 16,04.
Seth
2

Solusi lain untuk ini, yang tidak memerlukan pindah dari sshd.socketke sshd.service, adalah memulai tmuxserver sebagai layanan systemd [0]. Dengan cara ini, tmuxserver sudah berjalan ketika Anda SSH ke server, bukannya melahirkan oleh tmuxperintah di SSH, sehingga tidak akan dibunuh.

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

Song Gao
sumber
Apakah ini berfungsi ketika saya belum mendapatkan root?
gerrit
Ya, itu solusi yang valid. Tetapi Anda masih ingin menyelesaikan kasus dengan memulai kembali layanan SSH melalui sesi SSH. :)
Pavel Šimerda
Guys, jika Anda menggunakan OpenRC, saya membuat skrip init tmux yang melakukan hal yang sama dengan file layanan yang disebutkan dalam
ArchWiki