Membaca pertanyaan ini membuat saya bertanya-tanya. Dengan asumsi screen
tidak sedang digunakan. Jika sesi SSH pada target Linux dijatuhkan, untuk alasan apa pun, dan Anda menyambung kembali sebelum server membunuh sesi karena batas waktu, apakah mungkin untuk mendapatkan kembali kendali atas perintah yang berjalan sehingga tidak akan dibatalkan karena sesi yang rusak ?
32
Jawaban:
Mencoba untuk menghubungkan deskriptor file STD * terminal saat ini dengan proses yang berjalan lama hanya meminta masalah. Bahkan jika Anda berhasil melakukan itu, kontrol pekerjaan terminal tidak akan berfungsi seperti yang diharapkan. Anda akan memiliki kekacauan yang tertinggal jika Anda akhirnya keluar dari program yang diambil alih, dan apa yang terjadi pada shell yang mengorbankan deskriptor file untuk diserahkan ke proses yang baru dilatar belakangi. Akankah ssh tetap terbuka saat cangkang itu pergi? Mungkin tidak. Jadi, Anda harus mengarahkannya ke tempat lain terlebih dahulu.
Mungkin atau tidak, saya bertaruh lebih baik membiarkan proses yang terbengkalai terbunuh "secara alami". Jika Anda melakukan sesuatu yang cukup penting untuk membenarkan mencoba melakukan semua peretasan yang diperlukan untuk melanjutkan kontrol dan Anda berada di tautan yang tidak stabil, Anda mungkin harus tahu bahwa sebelumnya dan hanya menggunakan layar (atau vnc, atau apa pun yang mengapung Anda terlepas- perahu kontrol). :)
sumber
Saya tahu ini adalah pertanyaan lama, tetapi saya merasa penting untuk menambahkan temuan saya jika ada orang lain yang menemukan ini seperti saya.
Saya belum melihat konsekuensi yang tidak biasa untuk melakukan ini ya, tapi ini adalah apa yang saya gunakan dan itu bekerja dengan luar biasa. Kadang-kadang ketika kita menjalankan proses panjang pada server kita, kadang-kadang akan memutuskan sesi ssh. Proses bersama dengan sesi tty tampaknya tetap berjalan tetapi kami tidak dapat terhubung kembali. Saya menemukan program di bawah ini untuk menarik proses ke sesi yang baru terhubung.
https://github.com/nelhage/reptyr
Ini info lebih lanjut
https://blog.nelhage.com/2011/02/changing-ctty/
sumber
Secara umum, cara yang tepat untuk menangani ini adalah mempersiapkannya terlebih dahulu, menggunakan GNU
screen
atau bashnohup
ataudisown
mekanisme. Jika Anda menggunakantcsh
, shell akan menolak pekerjaan latar belakang saat keluar secara tidak normal.Jika Anda tidak menggunakan
screen
tetapi telah berhasil menjaga proses Anda berjalan melalui salah satu metode yang ditolak , Anda mungkin dapat memalsukan menghubungkan kembali ke proses dengangdb
( sumber ):Sekarang, Anda harus mengubah proses ini untuk situasi Anda. Saya ragu itu akan membantu jika Anda belum berhasil menyangkal prosesnya. Jika Anda menggunakan
bash
, melihat posting ini tentang membuat pesta otomatis memungkiri proses latar belakang saat keluar (pada dasarnya, matikan huponexit dengan shopt ). Dengan proses foreground, Anda harus menggunakan nohup .sumber
Mungkin tidak. Saya tidak dapat menjamin bahwa itu tidak mungkin tetapi saya benar-benar meragukannya.
Satu hal adalah kurangnya membunuh shell dan kemungkinan perintah berjalan sebagai konsekuensi dari penghentian koneksi ssh. Ini tidak begitu sulit, Anda harus dapat menggunakan mekanisme nohup dan serupa seperti yang disebutkan dalam pertanyaan lain.
Tetapi kemudian, asumsikan bahwa Anda memulai
ssh somehost nuhup vim /some/file
dan koneksi mati. Anda menjalankanssh somehost
untuk masuk lagi dan dapat melihat bahwa proses vim Anda masih berjalan. Namun, bagaimana Anda terhubung ke proses itu lagi? Proses forground interaktif memiliki kontrol tty dan yang dibuka untuk proses vim Anda ketika dimulai sejak itu telah ditutup. Saya tidak yakin apakah ada cara "membuka kembali" lagi di shell baru Anda (seperti halnya jika Anda memiliki beberapa pekerjaan latar belakang yang berjalan dalam satu shell Anda tidak dapat mengesampingkan semua yang ada di shell lain).Screen
secara eksplisit telah ditulis untuk memiliki fungsi ini. Pada startup itu bercabang dua proses, proses manajemen terminal dan dan proses klien. Interaksi adalah aplikasi <--> klien terminal manager <-->, dan ketika Anda melepaskan atau kehilangan koneksi proses klien mati sementara manajer terminal terus hidup. Layar memiliki beberapa dukungan khusus untuk dilampirkan ke proses manajemen terminal lagi nanti, dan saya tidak berpikir ini mungkin dalam kasus umum.sumber
retty mungkin bisa membantu Anda, tetapi penafiannya sangat nyata dan relevan :)
sumber
Jika sesi dijatuhkan, itu berarti TTL sudah kedaluwarsa, jadi tidak ada lagi tty untuk Anda (seperti yang saya mengerti). Tetapi, jika koneksi jaringan Anda terganggu, sesi SSH Anda mungkin tidak perlu turun, dan Anda harus dapat melanjutkan koneksi Anda dan melanjutkan. Apakah itu yang Anda tanyakan?
sumber
Ada tautan ke beberapa kode pencurian tty dalam pertanyaan ini . Anda secara teoritis harus dapat menggunakan ini untuk mendapatkan kembali kendali atas proses nohup.
sumber