Bagaimana memulihkan shell setelah pemutusan

37

Sedang melakukan pekerjaan pada mesin CentOS 5.6 jarak jauh dan jaringan saya terus menurun. Apakah ada cara agar saya dapat memulihkan sesi yang digantung setelah terhubung kembali?

EDIT: saya sedang melakukan beberapa pembaruan dan instalasi dengan yum dan saya khawatir ini mungkin menjadi masalah jika proses terus menggantung di tengah apa pun yang mereka lakukan.

Jeff Schaller
sumber
6
tmux atau layar.
sehe

Jawaban:

63

Tidak ada cara, tetapi untuk mencegah ini saya suka menggunakan tmux. Saya memulai tmux, memulai operasi dan melanjutkan perjalanan. Jika saya kembali dan menemukan koneksi telah terputus, yang harus saya lakukan adalah menyambung kembali dan mengetik tmux attach.

Ini sebuah contoh.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
sumber
jangan memiliki tmux, dan saya tidak diizinkan untuk menginstal hal-hal yang tidak ada dalam daftar pekerjaan saya ...
5
@sergio Hatiku berdarah :-)) Gunakan screen.
4
@sergio Pada sistem Unix, hampir semua aplikasi yang tidak memerlukan izin root untuk dijalankan dapat diinstal di direktori home.
Kusalananda
35

Rekomendasi untuk tmux dan layar adalah saran yang bagus. Mereka menyiratkan jawaban untuk pertanyaan Anda, tetapi tidak benar-benar menyatakannya. Jawaban atas pertanyaan itu adalah: tidak mungkin. Jika Anda masuk melalui ssh, shell berakhir ketika koneksi turun. Cara mengatasinya adalah untuk masuk dan segera memulai terminal virtual dari beberapa jenis (seperti tmux). Ketika koneksi turun, shell tempat Anda berada berakhir, tetapi Anda dapat membuka shell baru dan menyambung kembali ke terminal virtual (yang menjalankan shell di mana Anda benar-benar melakukan pekerjaan Anda.)

William Pursell
sumber
Baik. sudah jelas sekarang.
Dengan asumsi proses yum masih berjalan (tidak segera berakhir ketika shell mendapat SIGHUP), reptyr atau sejenisnya mungkin cukup untuk memulihkan proses atau - gagal itu - mendapatkan output di masa depan. Shell umumnya akan diakhiri pada putuskan.
Eroen
@ Eroen Maksud Anda, bahkan ketika menggunakan tmux, OS akan menghentikan proses tmux setelah menemukan bahwa koneksi terputus?
Dojo
@ Doo Ketika koneksi diputus, instance tmux akan dihentikan, tetapi sesi tmux (dan shell yang dikelolanya) akan tetap aktif.
William Pursell
Jika pengguna kehilangan koneksi ke server ssh jarak jauh karena misalnya dia tiba-tiba secara tidak sengaja mencabut kabel RJ-45, saya pikir server ssh masih menyimpan sesi ini sampai batas waktu yang telah ditentukan (misalnya 120 detik). Jadi dalam hal ini, apakah ada cara untuk melanjutkan sesi ini yang masih hidup di sisi server ssh dalam 120 detik setelah kabel dicabut?
Gab 是 好人
8

Seperti kata William, jawaban singkatnya adalah tidak, tidak ada jalan. Untuk mencegah ini, Anda bisa menggunakan perintah layar sebelum Anda kehilangan koneksi

Nicholas Smith
sumber
dari apa yang saya mengerti, saya harus memulai yum dengan layar ... welll, saya tidak. saya tidak bisa menjalankan kembali yum katanya masih digunakan dan saya tidak ingin memaksanya membunuhnya. ..bagaimana saya bisa mendapatkan kembali kendali atas yum yang sedang berjalan?
dan byobu adalah pelengkap yang bagus untuk layar, untuk membuatnya secara otomatis diluncurkan di terminal grafis launchpad.net/byobu
Sejauh yang saya tahu Anda tidak bisa, kecuali ada beberapa cara tersembunyi untuk mengarahkan output dari perintah yum ke sesi jangka Anda saat ini, tetapi saya tidak bisa memikirkan salah satu dari atas kepala saya.
Nicholas Smith
Ada sejumlah solusi parsial untuk ini menggunakan debugger & c. untuk memberikan proses shell induk baru. Reptyr adalah satu, dan sebuah posting blog menjelaskan masalah, solusi dan beberapa implementasi lainnya.
Eroen
3

Tidak, Anda tidak dapat memulihkan shell setelah pemutusan. Sebaliknya yang dapat Anda lakukan adalah memastikan perintah yang Anda jalankan terus berjalan setelah pemutusan.

Untuk mencapai ini, gunakan perintah "nohup" dan "disown", yang biasanya dibangun di sebagian besar shell, yaitu Anda tidak perlu menginstal apa pun. Ini hanya berfungsi untuk perintah non-interaktif.

Jadi, langkah-langkahnya adalah sebagai berikut:

  1. Login ke server
  2. Jalankan perintah Anda: "nohup sudo yum update &" (ini juga akan mencatat semua output ke file nohup.out di direktori Anda saat ini)
  3. Jalankan "disown% 1"
  4. Jangan ragu untuk memutuskan koneksi pada saat ini atau menunggu untuk diputuskan :)

Ketika Anda kembali ke server, cukup "tail nohup.out" untuk melihat bagaimana perintah itu dilakukan.

zygis
sumber
Tidakkah ini bekerja buruk pada kasus umum ? Misalnya, dengan perintah yang ingin input pada satu waktu atau yang lain ... Untuk perintah yang benar-benar non-interaktif, mungkin bekerja dengan cukup baik dan menghindari overhead dari (dan mungkin perlu menginstal) terminal multiplexer.
CVn
Ya, ini hanya berfungsi jika perintah Anda tidak menginginkan input pengguna, saya telah memperbarui jawabannya. Secara keseluruhan terminal multiplexer adalah cara yang pasti, tetapi disebutkan bahwa tidak ada alat tambahan yang diizinkan untuk diinstal.
zygis
Tentu saja, ini adalah jawaban yang valid, hanya sedikit terbatas dalam kemungkinan penggunaannya. Terpilih dengan hasil edit.
CVn
3

Seseorang menambahkan reptyr dalam komentar daripada jawaban jadi saya tidak bisa membatalkannya, tapi sepertinya itu jawaban yang bagus untuk pertanyaan yang diedit dan bekerja dengan baik pada CentOS.

lihat: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Apakah ada cara agar saya dapat memulihkan sesi yang digantung setelah terhubung kembali?

EDIT: saya sedang melakukan beberapa pembaruan dan instalasi dengan yum dan saya khawatir ini mungkin menjadi masalah jika proses terus menggantung di tengah apa pun yang mereka lakukan.

Jadi hal yang sama, saya kehilangan koneksi jarak jauh ke sesi pembaruan yum. Jadi saya mencari dan menemukan pertanyaan ini ... kemudian menghubungkan kembali dan menggunakan layar saat ini:

  1. sambungkan kembali ssh
  2. layar
  3. instal reptyr sesuai tautan di atas
  4. ps -a | grep yum
  5. reptyr psid

dan di sinilah aku pada prompt yang pulih yang diberikan yum beberapa jam sebelumnya.

Secara teknis semua jawabannya benar, ini BUKAN pemulihan dari sesi yang digantung, ini merupakan perbaikan dari proses yatim untuk sesi saat ini. Dan sangat berguna juga ...

Ingleno
sumber
1

Seperti yang disarankan banyak orang screendan tmux, keduanya mendukung fungsi dasar, tetapi memiliki fitur spesifik yang berbeda, sehingga orang tidak dapat mengatakan bahwa satu lebih unggul dari yang lain dalam semua kasus. Sebagai contoh, hanya tmux yang mendukung Window-splitting , sementara hanya layar GNU yang dapat beralih dengan pembungkus garis panjang (Ctrl + ar). Lihat perbandingan lebih detail di sini .

Ada juga alat khusus untuk memperbaiki masalah ssh ini:

Autossh adalah program untuk memulai salinan ssh dan memonitornya, memulai kembali seperlunya jika mati atau berhenti melewati lalu lintas. Idenya adalah dari rstunnel.

Mosh adalah aplikasi terminal jarak jauh yang memungkinkan roaming, mendukung konektivitas terputus-putus, dan menyediakan gema lokal yang cerdas dan pengeditan garis penekanan tombol pengguna. Mosh adalah pengganti SSH. Ini lebih kuat dan responsif, terutama melalui Wi-Fi, seluler, dan sambungan jarak jauh.

Yaroslav Nikitenko
sumber
-1

Ini bisa dilakukan dengan menggunakan tmuxshell. Jika Anda terputus, cara tercepat untuk memasang kembali sesi adalah:

tmux a #0
cmcginty
sumber
Ini tidak menambahkan apa pun yang tidak diterima oleh jawaban yang diterima. Itu juga mengasumsikan bahwa pengguna sudah memiliki tmuxsesi berjalan.
Kusalananda
2
Ini bisa menjadi komentar pada jawaban yang mengatakan "Anda dapat menyingkat attachsebagai a".
Jeff Schaller