แบบสอบถาม MySQL ของฉันจะยังคงทำงานต่อไปแม้ว่าการเชื่อมต่อ ssh ของฉันจะลดลง?


16

ฉันเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน SSH และลงชื่อเข้าใช้ mysql และขอให้เรียกใช้แบบสอบถาม (ผลลัพธ์ที่ถูกทิ้งลงใน CSV) ซึ่งอาจใช้เวลานานกว่าหนึ่งชั่วโมง แม้ว่าฉันจะสั่งให้ไคลเอนต์ของฉันส่งแพ็กเก็ตว่างทุก ๆ 60 วินาทีเพื่อให้เซสชันยังคงใช้งานอยู่ฉันยังคงหวาดระแวงที่แบบสอบถาม / กระบวนการ mysql สามารถยุติได้ดังนั้นคำถามของฉันคือ:

  1. เซสชั่น ssh ที่ถูกยกเลิก (เนื่องจากไม่มีการใช้งาน) จะฆ่าโพรเซส mysql หรือไม่?
  2. ฉันจะมั่นใจได้อย่างไรว่าสิ่งนี้จะไม่เกิดขึ้น - แพ็คเก็ต null จะส่งทุก ๆ 60 วินาทีเพียงพอหรือไม่

คำตอบ:


9

เชลล์ส่วนใหญ่ส่ง SIGHUP ไปยังกลุ่มกระบวนการพื้นหน้าเมื่อออก (และในบางกระบวนการพื้นหลังเช่นกันในการทุบตีนี้จะถูกควบคุมด้วยตัวเลือกเชลล์huponexit) ซึ่งอาจทำให้มันตายขึ้นอยู่กับว่าลูกค้า mysql ของคุณจัดการที่

คุณสามารถเรียกใช้คำสั่งที่เติมไว้nohupเพื่อให้มีการ reparented โดย init ถ้าเชลล์ของคุณออกโดยไม่คำนึงว่าเชลล์ของคุณส่ง SIGHUP หรือไม่ (การถูก reparented โดย init นั้นไม่เกี่ยวข้องกับ nohup โดยเฉพาะ

อาจจะเป็นวิธีการแก้ปัญหาอร่อยมากขึ้นจะใช้tmux, screen, dtachหรือคล้ายกันที่จะเรียกลูกค้าแยกห่างจากเปลือกและการควบคุม terminal ของคุณ ด้วยวิธีนี้หากเปลือกของคุณยกเลิกการเชื่อมต่อคุณเพิ่งเชื่อมต่อกับเซสชันที่คุณเรียกใช้แบบสอบถามอีกครั้ง

โดยทั่วไปแล้วแพ็คเก็ตแบบ Keepalive จะไม่สำคัญการเชื่อมต่อจะไม่ยุติลงโดยไม่มีเหตุผล ข้อกังวลที่เร่งด่วนกว่านี้คือการสูญเสียการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ด้วยเหตุผลอื่น (เครือข่ายล้มเหลว ฯลฯ )


ขอขอบคุณ! เพื่อความกระจ่างแจ้งฉันกำลังเรียกใช้คิวรีที่แท้จริงภายใน mysql - ตราบใดที่ฉันเตรียมnohupเมื่อล็อกอินเข้าสู่ mysql สิ่งนี้จะยังคงมีคิวรีที่ทำงานอยู่ในนั้นหรือไม่
njp

1
@njp หากคุณต้องการเรียกใช้แบบโต้ตอบคุณnohupจะไม่ได้รับประโยชน์อะไรมากนักเนื่องจาก mysql REPL จะไม่ได้เชื่อมต่อกับเทอร์มินัล ลองใช้หนึ่งในมัลติเพล็กเซอร์ (หรือดีแทค) ที่ฉันกล่าวถึงข้างต้นแทนพวกเขาอาจจะตอบสนองความต้องการของคุณได้ดีขึ้น
Chris Down

2

ฉันเริ่มใช้งานscreenเซสชันเมื่อฉันใส่ในกล่องบางส่วนเพื่อป้องกันสิ่งนั้นและเพื่อเป็นโบนัสเพิ่มฉันได้รับหลายแท็บไม่สามารถเอาชนะได้ หากฉันตัดการเชื่อมต่อด้วยเหตุผลบางอย่างฉันสามารถกลับไปที่เซสชันหน้าจอของฉันอีกครั้ง

ปรับปรุง

เพื่อตอบ # 2 ฉันจะเรียกใช้mysqlจากภายใน bash shell ผ่านเซสชันหน้าจอ ฟังดูซับซ้อน แต่เป็นเพียง:

$: screen
$: mysql

คุณสามารถแก้ไขไฟล์ ~ / .screenrc ของคุณเพื่อเพิ่มคำอธิบายภาพที่ด้านล่างของเซสชันหน้าจอเพื่อให้คุณสามารถติดตามแท็บเปลี่ยนชื่อแท็บ ฯลฯ หากคุณไม่ได้เชื่อมต่อเมื่อคุณเชื่อมต่อใหม่

$: screen -d

และนั่นจะแสดงเซสชันเดี่ยว ๆ หากต้องการติดตั้งใหม่ให้เรียกใช้สิ่งที่ต้องการ

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

หรืออะไรก็ตามที่ id ของหน้าจอเซสชันคือ คุณย้อนกลับไปในที่ที่คุณออกไป คุณต้องเรียกใช้screen -dในฐานะผู้ใช้เดียวกันกับที่เริ่มเซสชันหน้าจอแม้ว่า fyi หรือรูทแน่นอน ฉันไม่แน่ใจจริงๆเพราะหลังจากฉันไปฉันมักsudo su -จะไม่ต้องทำทุกคำสั่ง


1
ในขณะที่คำแนะนำในการใช้งานscreenเป็นเสียง แต่ไม่ได้ตอบคำถามสองข้อที่ระบุโดย OP โดยตรง
บารัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.