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:
- ssh ke mesin
- jalankan
tmux
untuk memulai tmux ctrl-B D
untuk melepaskan (pada titik ini saya bisa bergabung kembali dengantmux attach
- close ssh sesi (pada titik ini sesi tmux terbunuh, saya sudah bisa mengamati ini ketika saya login sebagai root di terminal yang berbeda)
- sambungkan kembali dengan ssh dan jalankan
tmux attach
dan saya mendapatkan pesanno sessions
dan menjalankantmux ls
pengembalianfailed 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 exit
atau 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.
Jawaban:
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
KillMode
arahan. Proyek hulu tidak AFAIK termasuk.service
file apa pun dan itu berbeda berdasarkan distribusi. Biasanya ada dua cara untuk mengaktifkan SSH di sistem Anda. Salah satunya adalah klasikssh.service
yang mempertahankan daemon SSH yang berjalan lama mendengarkan di jaringan. Yang lain adalah melalui aktivasi soket yang ditangani olehssh.socket
yang 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.service
bukanssh.socket
. Yang lain adalah mengaturKillMode=process
diService
bagian[email protected]
.The
KillMode=process
Pengaturan juga dapat berguna dengan klasikssh.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.
sumber
init
daripadasystemd
. Tapi ini sedikit berbeda, lihat pertanyaanku .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
, atautmux
, 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.socket
kesshd.service
.sumber
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"
sumber
-bash: systemd-run: command not found
padaRed Hat Enterprise Linux Server release 6.8 (Santiago)
.Solusi lain untuk ini, yang tidak memerlukan pindah dari
sshd.socket
kesshd.service
, adalah memulaitmux
server sebagai layanan systemd [0]. Dengan cara ini,tmux
server sudah berjalan ketika Anda SSH ke server, bukannya melahirkan olehtmux
perintah di SSH, sehingga tidak akan dibunuh.[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd
sumber
Jawaban terbaik yang saya temukan, IMO, diberikan di Prevent Logoff dari Killing tmux Session :
Ini "fitur" telah ada di
systemd
sebelumnya, tapi yangsystemd
pengembang memutuskan untuk efek perubahan default , untuk mengaktifkan pengaturan untuk penghentian proses anak pada log out dari sesi.Anda dapat mengembalikan pengaturan ini di
logind.conf
(/etc/systemd/logind.conf
):sumber