Lanjutkan perintah yang berjalan di sesi SSH yang dijatuhkan

32

Membaca pertanyaan ini membuat saya bertanya-tanya. Dengan asumsi screentidak 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 ?

John Gardeniers
sumber
Perintah apa itu? Saya menduga umumnya jawabannya tidak.
davr
Tidak ada perintah khusus, saya hanya bertanya sebagai konsep umum.
John Gardeniers
1
Seseorang dengan pemahaman yang komprehensif tentang bagaimana sesi tty diinisialisasi mungkin dapat memberi tahu kita caranya. Sepertinya jika Anda bisa membuat ulang sesi baru pada tty yang sama dan secara eksplisit menetapkan PPID sebelumnya, itu mungkin. Saya hanya menunggu beberapa guru nix berjanggut untuk datang dan meniup pikiran kita. Bagaimanapun juga mimpi itu.
CarpeNoctem
Apa yang terjadi jika Anda bereksperimen dengan laptop yang ditambatkan dan mencabut kabel ethernet?
Paul
@ ~ drpaulbrewer - Persis sama dengan ketika Anda melakukannya dengan mesin desktop - koneksi terputus. Bagaimana koneksi terputus tidak relevan dengan pertanyaan.
John Gardeniers

Jawaban:

13

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). :)

dannysauer
sumber
Saya merasa sulit untuk memilih jawaban untuk diterima, jadi saya menerima yang ini karena pada saat ini satu-satunya yang memiliki suara positif.
John Gardeniers
5

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/

pengguna215086
sumber
5
Selamat Datang di Kesalahan Server! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
EEAA
terima kasih, @ user215086! Anehnya, ini berhasil! Saya mengedit file konfigurasi panjang untuk sementara, menambahkan banyak pengaturan khusus dan komentar yang ditulis dengan hati-hati, dan hampir selesai ketika koneksi terputus! "Tidaaaaaak !! ..." Setelah aku selesai meneriakkan kata-kata kotor di langit-langit, aku memasang reptyr, dan voila! Saya memulihkan sesi ssh tepat di mana saya meninggalkannya masih di dalam editor, menyelesaikan beberapa hal, menyelamatkan, menyelesaikan !! Woo hoo! reptyr mengagumkan.
ColdCold
4

Secara umum, cara yang tepat untuk menangani ini adalah mempersiapkannya terlebih dahulu, menggunakan GNU screenatau bash nohupatau disownmekanisme. Jika Anda menggunakan tcsh, shell akan menolak pekerjaan latar belakang saat keluar secara tidak normal.

Jika Anda tidak menggunakan screentetapi telah berhasil menjaga proses Anda berjalan melalui salah satu metode yang ditolak , Anda mungkin dapat memalsukan menghubungkan kembali ke proses dengan gdb( sumber ):

[...] dengan beberapa peretasan yang kotor, bukan tidak mungkin untuk membuka kembali proses 'stdout / stderr / stdin. [...]

Dan kemudian gunakan gdb misalnya untuk melampirkan ke proses, lakukan beberapa panggilan tutup (0)
panggilan tutup (1)
panggilan tutup (2)
panggilan terbuka ("/ dev / pts / xx", ...)
panggilan dup (0)
panggilan dup (0)
lepaskan

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 .

quack quixote
sumber
1

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/filedan koneksi mati. Anda menjalankan ssh somehostuntuk 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).

Screensecara 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.

hlovdal
sumber
Terima kasih. Itu yang saya harapkan. Mari kita lihat apakah seseorang bisa membuktikan kita salah. ;)
John Gardeniers
Saya telah belajar sejak menulis jawaban ini bahwa ada reptyr program untuk proses "re-ptying". Jadi secara teori bisa dilakukan, tapi saya masih berpikir jawaban keseluruhan mungkin tidak.
hlovdal
1

retty mungkin bisa membantu Anda, tetapi penafiannya sangat nyata dan relevan :)

Evan Broder
sumber
1

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?

monomyth
sumber
Saya bertanya secara umum tetapi saya paling tertarik ketika masalah jaringan menyebabkan koneksi turun. Secara keseluruhan, saya akan mengatakan itu tidak terlihat terlalu bagus. Tetap saja, ini diminta hanya karena penasaran, daripada perlu. Selalu menyenangkan mengetahui jawabannya sebelum Anda membutuhkannya. ;)
John Gardeniers
koneksi yang terputus bukanlah konsep yang sederhana, seperti yang terlihat. Anda mungkin mengalami beberapa tahapan berbeda. Misalnya, Anda harus dapat mencabut kabel jaringan Anda, hubungkan kembali dalam beberapa detik dan sesi SSH Anda akan tetap terjaga, Anda tidak perlu menghubungkan kembali untuk melanjutkan, meskipun Anda mungkin mengalami penundaan awal yang singkat. Jika Anda menemukan diri Anda dengan sesi ssh terbunuh, itu berarti ada sesuatu yang salah dikonfigurasi (atau lebih tepatnya tidak dikonfigurasi dengan benar untuk mendukung gangguan semacam ini).
monomyth
0

Ada tautan ke beberapa kode pencurian tty dalam pertanyaan ini . Anda secara teoritis harus dapat menggunakan ini untuk mendapatkan kembali kendali atas proses nohup.

Kamil Kisiel
sumber
1
Perintah penolakan yang disebutkan dalam jawaban untuk pertanyaan itu juga layak diselidiki lebih lanjut. Terima kasih.
John Gardeniers