Czy moje zapytanie MySQL będzie nadal działać, nawet jeśli połączenie ssh zostanie zerwane?


16

Połączyłem się z serwerem przez SSH i zalogowałem się do mysql, i poprosiłem go o uruchomienie zapytania (którego wyniki są wrzucane do pliku CSV), które może zająć znacznie ponad godzinę. Mimo że poinstruowałem mojego klienta, aby wysyłał pakiety zerowe co 60 sekund, aby sesja była aktywna, nadal jestem paranoikiem, że kwerenda / proces mysql może zostać zakończona, więc moje pytania są następujące:

  1. Czy anulowana sesja ssh (z powodu braku aktywności) zabije proces zapytania mysql?
  2. Jak mogę się upewnić, że tak się nie stanie - czy pakiet zerowy wysyła co 60 sekund?

Odpowiedzi:


9

Większość powłok wysyła SIGHUP do grupy procesów pierwszego planu przy wyjściu (a także w niektórych procesach w tle, w bash jest to kontrolowane za pomocą opcji powłoki huponexit), co może spowodować jego śmierć, w zależności od tego, jak twój klient mysql sobie z tym poradzi.

Możesz uruchomić komendę z poleceniem, nohupaby była ona ponownie zapoczątkowana przez init, jeśli twoja powłoka zakończy działanie, bez względu na to, czy powłoka wysyła SIGHUP, czy też nie (bycie reparentowanym przez init nie jest związane z nohup - po prostu przeżyło swojego rodzica).

Ewentualnie łatwiejszym rozwiązaniem byłoby użyć tmux, screen, dtachlub podobne do uruchomić klienta oderwane od swojej skorupy i kontrolowania terminala. W ten sposób, jeśli twoja powłoka rozłączy się, po prostu ponownie połączysz się z sesją, w której uruchomiłeś zapytanie.

Zasadniczo pakiety podtrzymujące nie mają znaczenia, połączenie nie kończy się bez powodu. Bardziej palącą obawą byłaby utrata połączenia między klientem a serwerem z innych powodów (awaria sieci itp.).


Dziękuję Ci! Tylko dla wyjaśnienia, uruchamiam rzeczywiste zapytanie w mysql - tak długo, jak będę się przygotowywał nohuppodczas logowania do mysql, to utrzyma zapytania wewnątrz?
njp,

1
@njp Jeśli chcesz uruchomić interaktywnie, nohupnie przyda ci się dużo, ponieważ mysql REPL nie zostanie dołączony do terminala. Zamiast tego spróbuj użyć jednego z multiplekserów (lub dtach), o których wspomniałem powyżej, prawdopodobnie będą lepiej odpowiadały Twoim potrzebom.
Chris Down,

2

Zacząłem uruchamiać screensesje, kiedy ssh w polu, częściowo, aby temu zapobiec, a jako dodatkowy bonus, dostaję wiele kart, nie mogę go pokonać. Jeśli z jakiegoś powodu jestem rozłączony, mogę ponownie dołączyć do sesji ekranowej.

Aktualizacja

Aby odpowiedzieć # 2, pobiegłbym mysqlz poziomu powłoki bash przez sesję screen. Brzmi skomplikowanie, ale to po prostu:

$: screen
$: mysql

Możesz edytować plik ~ / .screenrc, aby dodać podpisy na dole sesji ekranowej, dzięki czemu możesz śledzić swoje karty, zmieniać nazwy kart itp. Jeśli kiedykolwiek się rozłączysz, po ponownym połączeniu po prostu uruchom

$: screen -d

i to pokaże wszelkie odłączone sesje. Aby ponownie podłączyć, po prostu uruchom coś takiego

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

Lub jakikolwiek identyfikator sesji ekranowej. Jesteś dokładnie tam, gdzie skończyłeś. Musisz jednak działać screen -djako ten sam użytkownik, który rozpoczął sesję ekranową, po prostu fyi lub root. Nie jestem do końca pewien, ponieważ po ssh zawsze jestem w stanie, sudo su -więc nie muszę powtarzać każdego polecenia.


1
Chociaż rada, którą należy zastosować, screenjest trafna, nie odpowiada ona bezpośrednio na dwa pytania wymienione przez PO.
Barun,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.