Truy vấn MySQL của tôi có tiếp tục chạy ngay cả khi kết nối ssh của tôi bị rớt không?


16

Tôi đã kết nối với một máy chủ qua SSH và đăng nhập vào mysql và yêu cầu nó chạy một truy vấn (kết quả được đưa vào CSV) có thể mất hơn một giờ. Mặc dù tôi đã hướng dẫn khách hàng của mình gửi các gói null sau mỗi 60 giây để duy trì phiên hoạt động, tôi vẫn còn hoang tưởng rằng quy trình / truy vấn mysql có thể chấm dứt, vì vậy câu hỏi của tôi là:

  1. Một phiên ssh bị hủy (do không hoạt động) sẽ giết quá trình truy vấn mysql?
  2. Làm thế nào tôi có thể đảm bảo điều này không xảy ra - gói null được gửi cứ sau 60 giây đủ chưa?

Câu trả lời:


9

Hầu hết các shell gửi SIGHUP đến nhóm tiến trình tiền cảnh khi thoát (và, trong một số, các quá trình nền cũng vậy, trong bash, điều này được kiểm soát với tùy chọn shell huponexit), điều này có thể khiến nó chết, tùy thuộc vào cách máy khách mysql của bạn xử lý.

Bạn có thể chạy lệnh của mình được chuẩn bị trước nohupđể được sửa chữa bởi init nếu shell của bạn thoát, bất kể shell của bạn có gửi SIGHUP hay không (được sửa chữa bởi init không liên quan đến nohup - chỉ là nó đã vượt quá cha mẹ của nó).

Có thể là một giải pháp dễ chấp nhận hơn sẽ được sử dụng tmux, screen, dtachhoặc tương tự để chạy client trừu tượng xa vỏ và kiểm soát thiết bị đầu cuối của bạn. Bằng cách này, nếu trình bao của bạn ngắt kết nối, bạn chỉ cần kết nối lại với phiên mà bạn đang chạy truy vấn.

Nói chung, các gói bảo mật sẽ không thành vấn đề, kết nối sẽ không chấm dứt mà không có lý do. Một mối quan tâm cấp bách hơn sẽ là mất kết nối giữa máy khách và máy chủ vì những lý do khác (lỗi mạng, v.v.).


Cảm ơn bạn! Để làm rõ, tôi đang chạy truy vấn thực tế trong mysql - vì vậy miễn là tôi trả trước nohupkhi đăng nhập vào mysql, điều này sẽ tiếp tục các truy vấn chạy bên trong?
njp

1
@njp Nếu bạn muốn chạy tương tác, nohupsẽ không được sử dụng nhiều cho bạn, vì REPL mysql sẽ không được gắn vào thiết bị đầu cuối. Thay vào đó, hãy thử sử dụng một trong các bộ ghép kênh (hoặc dtach) mà tôi đã đề cập ở trên, chúng có thể sẽ phù hợp với nhu cầu của bạn hơn.
Chris Xuống

2

Tôi đã bắt đầu chạy screencác phiên khi tôi ssh vào một hộp, một phần để ngăn chặn điều đó như một phần thưởng bổ sung, tôi nhận được nhiều tab, không thể đánh bại nó. Nếu tôi bị ngắt kết nối vì một số lý do, tôi có thể gắn lại vào phiên màn hình của mình.

Cập nhật

Để trả lời # 2, tôi sẽ chạy mysqltừ trong bash shell qua một phiên màn hình. Nghe có vẻ phức tạp, nhưng đó chỉ là:

$: screen
$: mysql

Bạn có thể chỉnh sửa tệp ~ / .screenrc của mình để thêm chú thích ở cuối phiên màn hình để bạn có thể theo dõi các tab của mình, đổi tên các tab của mình, v.v. Nếu bạn bị ngắt kết nối, khi bạn kết nối lại chỉ cần chạy

$: screen -d

và điều đó sẽ hiển thị bất kỳ phiên tách ra. Để gắn lại, chỉ cần chạy một cái gì đó như

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

Hoặc bất cứ id nào của phiên màn hình là. Bạn quay lại ngay nơi bạn rời đi. Bạn phải chạy screen -dnhư cùng một người dùng đã bắt đầu phiên màn hình, chỉ là fyi hoặc root tất nhiên. Tôi không thực sự chắc chắn bởi vì sau khi tôi ssh trong tôi luôn sudo su -vì vậy tôi không phải sudo mỗi lệnh.


1
Mặc dù lời khuyên để sử dụng screenlà âm thanh, nhưng nó không trả lời trực tiếp hai câu hỏi được liệt kê bởi OP.
Barun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.