Будет ли мой MySQL-запрос продолжать выполняться, даже если мое ssh-соединение обрывается?


16

Я подключился к серверу по SSH, вошел в MySQL и попросил его выполнить запрос (результаты которого выводятся в CSV), который может занять более часа. Хотя я и приказал своему клиенту отправлять нулевые пакеты каждые 60 секунд, чтобы поддерживать активную сессию, я все еще параноик, что запрос / процесс mysql может завершиться, поэтому мои вопросы:

  1. Будет ли отмененный сеанс SSH (из-за неактивности) уничтожить процесс запроса MySQL?
  2. Как я могу убедиться, что этого не происходит - достаточно ли пустых пакетов каждые 60 секунд?

Ответы:


9

Большинство оболочек отправляют SIGHUP в группу процессов переднего плана при выходе (и, в некоторых случаях, также в фоновых процессах, в bash это контролируется с помощью параметра оболочки huponexit), что может привести к его смерти, в зависимости от того, как ваш клиент mysql справится с этим.

Вы можете запустить свою команду с добавленной nohupинициализацией, чтобы она была перекомпонована с помощью init, если ваша оболочка завершается, независимо от того, отправляет ли ваша оболочка SIGHUP или нет (переопределение с помощью init не связано конкретно с nohup - просто оно пережило своего родителя).

Возможно , более приемлемое решение было бы использовать tmux, screen, dtachили аналогичные для запуска клиента абстрагируется от вашей оболочки и управляющего терминалом. Таким образом, если ваша оболочка отключается, вы просто заново подключаетесь к сеансу, в котором выполнялся запрос.

В общем, пакеты keepalive не будут иметь значения, соединение не будет разорвано без причины. Более насущной проблемой будет потеря связи между клиентом и сервером по другим причинам (сбой сети и т. Д.).


Спасибо! Просто для пояснения, я выполняю фактический запрос в mysql - так что до тех пор, пока я вхожу в nohupсистему при входе в mysql, это будет сохранять запросы, выполняющиеся внутри?
njp

1
@njp Если вы хотите работать в интерактивном режиме, nohupон вам не очень пригодится, поскольку mysql REPL не будет подключен к терминалу. Вместо этого попробуйте использовать один из мультиплексоров (или dtach), который я упоминал выше, они, вероятно, подойдут вам лучше.
Крис Даун

2

Я начал запускать screenсессии, когда я вставляю ssh в коробку, частично, чтобы предотвратить это, и в качестве дополнительного бонуса я получаю несколько вкладок, не могу побить его. Если по какой-то причине я отключен, я могу снова подключиться к сеансу экрана.

Обновить

Чтобы ответить на вопрос № 2, я бы запускал mysqlиз оболочки bash экранную сессию. Звучит сложно, но это просто:

$: screen
$: mysql

Вы можете отредактировать файл ~ / .screenrc, добавив подписи внизу экранной сессии, чтобы вы могли отслеживать вкладки, переименовывать вкладки и т. Д. Если вы когда-либо отключались, при повторном подключении просто запустите

$: screen -d

и это покажет любые отдельные сессии. Чтобы присоединить, просто запустите что-то вроде

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

Или каким бы ни был идентификатор сеанса экрана. Вы вернулись туда, где остановились. Вы должны работать screen -dпод тем же пользователем, который запустил сеанс экрана, просто fyi или root, конечно. Я не совсем уверен, потому что после того, как я ssh в я всегда, sudo su -поэтому я не должен sudo каждую команду.


1
Хотя совет по использованию screenобоснован, он не дает прямого ответа на два вопроса, перечисленных ОП.
Barun
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.