Apakah permintaan MySQL saya akan terus berjalan bahkan jika koneksi ssh saya turun?

16

Saya telah terhubung ke server melalui SSH dan masuk ke mysql, dan memintanya untuk menjalankan kueri (hasil yang dibuang ke CSV) yang bisa memakan waktu lebih dari satu jam. Meskipun saya telah menginstruksikan klien saya untuk mengirim paket nol setiap 60 detik untuk menjaga sesi tetap aktif, saya masih paranoid bahwa permintaan / proses mysql dapat diakhiri, jadi pertanyaan saya adalah:

  1. Apakah sesi ssh yang dibatalkan (karena tidak aktif) akan mematikan proses permintaan mysql?
  2. Bagaimana saya bisa memastikan ini tidak terjadi - apakah paket nol mengirim cukup setiap 60 detik?
njp
sumber

Jawaban:

9

Sebagian besar shell mengirim SIGHUP ke grup proses latar depan saat keluar (dan, dalam beberapa, proses latar belakang juga, di bash ini dikontrol dengan opsi shell huponexit), yang mungkin menyebabkannya mati, tergantung pada bagaimana klien mysql Anda mengatasinya.

Anda dapat menjalankan perintah yang diawali dengan nohupagar reparents by init jika shell Anda keluar, terlepas dari apakah shell Anda mengirimkan SIGHUP atau tidak (reparents by init tidak terkait dengan nohup secara khusus - hanya saja ia telah hidup lebih lama dari induknya).

Mungkin solusi yang lebih enak akan menggunakan tmux, screen, dtachatau serupa untuk menjalankan klien disarikan dari shell Anda dan mengendalikan terminal. Dengan cara ini, jika shell Anda terputus, Anda cukup menyambung kembali ke sesi tempat Anda menjalankan kueri.

Secara umum paket keepalive tidak masalah, koneksi tidak hanya berakhir tanpa alasan. Masalah yang lebih mendesak adalah hilangnya koneksi antara klien dan server karena alasan lain (kegagalan jaringan, dll).

Chris Down
sumber
Terima kasih! Hanya untuk klarifikasi, saya menjalankan kueri aktual dalam mysql - jadi selama saya menambahkan nohupketika masuk ke mysql, ini akan tetap ada kueri yang berjalan di dalam?
njp
1
@ njp Jika Anda ingin menjalankan secara interaktif, nohuptidak akan banyak berguna bagi Anda, karena REPL mysql tidak akan terpasang ke terminal. Coba gunakan salah satu multiplexer (atau dtach) yang saya sebutkan di atas, mereka mungkin akan lebih sesuai dengan kebutuhan Anda.
Chris Down
2

Saya sudah mulai menjalankan screensesi ketika saya memasukkan ke dalam kotak, sebagian untuk mencegah itu dan sebagai bonus tambahan, saya mendapatkan banyak tab, tidak bisa mengalahkannya. Jika saya terputus karena beberapa alasan, saya dapat menyambung kembali ke sesi layar saya.

Memperbarui

Untuk menjawab # 2, saya akan lari mysqldari dalam bash shell melalui sesi layar. Kedengarannya rumit, tapi itu hanya:

$: screen
$: mysql

Anda dapat mengedit file ~ / .screenrc Anda untuk menambahkan teks di bagian bawah sesi layar sehingga Anda dapat melacak tab Anda, mengganti nama tab Anda, dll. Jika Anda pernah terputus, ketika Anda terhubung kembali cukup jalankan

$: screen -d

dan itu akan menunjukkan sesi terpisah. Untuk memasang kembali, cukup jalankan sesuatu seperti

$: screen -r 551.pts-0.git

Atau apa pun id sesi layar itu. Anda segera kembali ke tempat Anda tinggalkan. Anda harus menjalankan screen -dsebagai pengguna yang sama yang memulai sesi layar, hanya fyi, atau root saja. Saya tidak begitu yakin karena setelah saya ssh saya selalu sudo su -jadi saya tidak perlu sudo setiap perintah.

MDMoore313
sumber
1
Meskipun saran untuk menggunakan screensuara, itu tidak langsung menjawab dua pertanyaan yang tercantum oleh OP.
Barun