Ma requête MySQL continuera-t-elle de fonctionner même si ma connexion ssh tombe?

16

Je me suis connecté à un serveur via SSH et je me suis connecté à mysql, et je lui ai demandé d'exécuter une requête (dont les résultats sont transférés dans un CSV) qui pourrait prendre plus d'une heure. Bien que j'aie demandé à mon client d'envoyer des paquets nuls toutes les 60 secondes pour maintenir la session active, je suis toujours paranoïaque que la requête / le processus mysql puisse se terminer, donc mes questions sont:

  1. Une session ssh annulée (en raison de l'inactivité) va-t-elle tuer le processus de requête mysql?
  2. Comment puis-je m'assurer que cela ne se produit pas - le paquet nul envoie-t-il toutes les 60 secondes suffisamment?
njp
la source

Réponses:

9

La plupart des shells envoient SIGHUP au groupe de processus de premier plan à la sortie (et, dans certains, les processus d'arrière-plan également, dans bash, cela est contrôlé avec l'option shell huponexit), ce qui pourrait le faire mourir, selon la façon dont votre client mysql gère cela.

Vous pouvez exécuter votre commande avant nohupde la faire réparer par init si votre shell se termine, que votre shell envoie SIGHUP ou non (être réparé par init n'est pas spécifiquement lié à nohup - c'est juste qu'il a survécu à son parent).

Peut - être une solution plus acceptable serait d'utiliser tmux, screen, dtachou similaire pour exécuter le client abstraire loin de votre coquille et le contrôle terminal. De cette façon, si votre shell se déconnecte, vous vous reconnectez simplement à la session dans laquelle vous exécutiez la requête.

En général, les paquets keepalive n'auront pas d'importance, la connexion ne se terminera pas sans raison. Une préoccupation plus urgente serait une perte de connexion entre le client et le serveur pour d'autres raisons (panne de réseau, etc.).

Chris Down
la source
Merci! Juste pour des éclaircissements, j'exécute la requête réelle dans mysql - donc tant que je préfixe nohuplors de la connexion à mysql, cela persistera les requêtes en cours d'exécution à l'intérieur?
njp
1
@njp Si vous voulez exécuter de manière interactive, nohupcela ne vous sera pas très utile, car le mysql REPL ne sera pas attaché au terminal. Essayez d'utiliser l'un des multiplexeurs (ou dtach) que j'ai mentionnés ci-dessus à la place, ils répondront probablement mieux à vos besoins.
Chris Down
2

J'ai commencé à exécuter des screensessions lorsque je ssh dans une boîte, en partie pour éviter cela et comme bonus supplémentaire, j'obtiens plusieurs onglets, je ne peux pas le battre. Si je suis déconnecté pour une raison quelconque, je peux me reconnecter à ma session d'écran.

Mise à jour

Pour répondre # 2, je voudrais exécuter à mysqlpartir d'un shell bash à travers une session d'écran. Cela semble compliqué, mais c'est juste:

$: screen
$: mysql

Vous pouvez éditer votre fichier ~ / .screenrc pour ajouter des légendes au bas de la session écran afin que vous puissiez garder une trace de vos onglets, renommer vos onglets, etc. Si vous êtes déconnecté, lorsque vous vous reconnectez, exécutez simplement

$: screen -d

et cela montrera toutes les sessions détachées. Pour rattacher, exécutez simplement quelque chose comme

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

Ou quel que soit l'identifiant de la session écran. Vous êtes de retour là où vous vous étiez arrêté. Vous devez cependant exécuter screen -dle même utilisateur que celui qui a démarré la session d'écran, juste fyi, ou root bien sûr. Je ne suis pas vraiment sûr car après avoir fait ssh, j'ai toujours sudo su -donc je n'ai pas à sudo chaque commande.

MDMoore313
la source
1
Bien que le conseil à utiliser screensoit judicieux, il ne répond pas directement aux deux questions énumérées par le PO.
Barun