Будет ли мой MySQL-запрос продолжать выполняться, даже если мое ssh-соединение обрывается?
16
Я подключился к серверу по SSH, вошел в MySQL и попросил его выполнить запрос (результаты которого выводятся в CSV), который может занять более часа. Хотя я и приказал своему клиенту отправлять нулевые пакеты каждые 60 секунд, чтобы поддерживать активную сессию, я все еще параноик, что запрос / процесс mysql может завершиться, поэтому мои вопросы:
Будет ли отмененный сеанс SSH (из-за неактивности) уничтожить процесс запроса MySQL?
Как я могу убедиться, что этого не происходит - достаточно ли пустых пакетов каждые 60 секунд?
Большинство оболочек отправляют 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 каждую команду.
nohup
систему при входе в mysql, это будет сохранять запросы, выполняющиеся внутри?nohup
он вам не очень пригодится, поскольку mysql REPL не будет подключен к терминалу. Вместо этого попробуйте использовать один из мультиплексоров (или dtach), который я упоминал выше, они, вероятно, подойдут вам лучше.Я начал запускать
screen
сессии, когда я вставляю ssh в коробку, частично, чтобы предотвратить это, и в качестве дополнительного бонуса я получаю несколько вкладок, не могу побить его. Если по какой-то причине я отключен, я могу снова подключиться к сеансу экрана.Обновить
Чтобы ответить на вопрос № 2, я бы запускал
mysql
из оболочки bash экранную сессию. Звучит сложно, но это просто:Вы можете отредактировать файл ~ / .screenrc, добавив подписи внизу экранной сессии, чтобы вы могли отслеживать вкладки, переименовывать вкладки и т. Д. Если вы когда-либо отключались, при повторном подключении просто запустите
и это покажет любые отдельные сессии. Чтобы присоединить, просто запустите что-то вроде
Или каким бы ни был идентификатор сеанса экрана. Вы вернулись туда, где остановились. Вы должны работать
screen -d
под тем же пользователем, который запустил сеанс экрана, просто fyi или root, конечно. Я не совсем уверен, потому что после того, как я ssh в я всегда,sudo su -
поэтому я не должен sudo каждую команду.источник
screen
обоснован, он не дает прямого ответа на два вопроса, перечисленных ОП.