ให้เซสชัน SSH ทำงานต่อหลังจากตัดการเชื่อมต่อ


208

บางครั้งฉันมีกระบวนการทำงานนานที่ฉันต้องการเริ่มก่อนกลับบ้านดังนั้นฉันสร้างเซสชัน SSH ไปยังเซิร์ฟเวอร์เพื่อเริ่มต้นกระบวนการ แต่จากนั้นฉันต้องการปิดแล็ปท็อปของฉันและกลับบ้านและต่อมาหลังอาหารเย็นฉันต้องการ ตรวจสอบกระบวนการที่ฉันเริ่มก่อนออกจากงาน ฉันจะทำสิ่งนั้นกับ SSH ได้อย่างไร ความเข้าใจของฉันคือว่าถ้าคุณหยุดการเชื่อมต่อ SSH ของคุณคุณจะหยุดเซสชันการเข้าสู่ระบบของคุณบนเซิร์ฟเวอร์ดังนั้นจึงฆ่ากระบวนการที่ใช้เวลานาน

คำตอบ:


205

ใช้nohupเพื่อทำให้กระบวนการของคุณเพิกเฉยต่อสัญญาณแฮงเอาท์:

$ nohup long-running-process &
$ exit

20
นี่ไง. ไม่จำเป็นต้องติดตั้งหน้าจอหรือ tmux นี่เป็นวิธีที่ดีที่จะทำ แน่นอนว่า 'หน้าจอ' หรือ 'tmux' เป็นทั้งแอปที่ยอดเยี่ยมและควรใช้เมื่อจำเป็น แต่ทำได้ง่ายเพียงแค่เรียกใช้กระบวนการในพื้นหลังซึ่งคุณสามารถออกจากระบบได้
reiche

2
ไม่มีใครชอบปฏิเสธ?
cjac

28
พวกเขามีวัตถุประสงค์ที่คล้ายกัน แต่พวกเขาแตกต่างกันในหลาย ๆ nohupสกัดกั้น SIGHUP เพื่อที่ว่าเมื่อกระสุนที่วิ่งออกมาและส่ง SIGHUP ไปยังลูกที่ยังวิ่งอยู่ของมันlong-running-processจะไม่ตาย disownเพียงแค่ลบงานที่ระบุออกจากรายการลูกของ Bash ดังนั้นมันจะไม่พยายามส่ง SIGHUP เลย nohupเป็นโปรแกรมที่แยกต่างหากจากเชลล์ดังนั้นจึงสามารถใช้งานได้กับเชลล์ทั้งหมดในขณะที่disownเป็น Bash builtin nohupยอมรับคำสั่งให้ทำงานในขณะที่disownทำงานหลังจากเริ่มงานแล้วเท่านั้นและคุณมีแบ็คกราวน์แล้วคุณจึงสามารถกลับไปที่เชลล์ได้
Warren Young

3
ตรวจสอบอย่างรวดเร็วที่น่ากลัวสำหรับผู้ที่ไม่คุ้นเคยกับ nohup และปฏิเสธ - เช่นเดียวกับบางวิธีที่ง่ายในการจัดการกับการประชุมขั้ว serverwatch.com/tutorials/article.php/3935306/...
แดน

7
tail -f nohup.outเพื่อตรวจสอบสิ่งที่เกิดขึ้นเมื่อคุณกลับมา
Ricardo Stuven

141

คุณต้องการใช้หน้าจอ GNU มันยอดเยี่ยมมาก!

ssh me@myserver.com
screen               #start a screen session
run-a-long-process

CTRL+ a, dการ detatch จากการใช้งานหน้าจอของคุณ

exit                 #disconnect from the server, while run-a-long-process continues

เมื่อคุณกลับมาที่แล็ปท็อปของคุณ:

ssh me@myserver.com
screen -r            #resume the screen session

จากนั้นตรวจสอบความคืบหน้าของกระบวนการที่ยาวนานของคุณ!

screenเป็นเครื่องมือที่ครอบคลุมมากและสามารถทำอะไรได้มากกว่าที่ฉันได้อธิบายไว้ ขณะที่อยู่ในเซสชันหน้าจอให้ลอง ctrl + a ,? เพื่อเรียนรู้คำสั่งทั่วไปสองสามคำ อาจพบมากที่สุดคือ:

  • CTRL+ a, cเพื่อสร้างหน้าต่างใหม่
  • CTRL+ a, nเพื่อสลับไปที่หน้าต่างถัดไปในเซสชันหน้าจอของคุณ
  • CTRL+ a, pเพื่อสลับไปยังหน้าต่างก่อนหน้าในเซสชันหน้าจอของคุณ
  • หากคุณเข้าสู่ระบบจากหลาย ๆ ระบบคุณอาจทิ้งตัวคุณเองโดยไม่ได้ตั้งใจไว้กับเซสชันหน้าจอที่ใช้งานอยู่บนคอมพิวเตอร์เครื่องอื่น ด้วยเหตุผลนั้นฉันจะกลับมาทำงานด้วยเสมอscreen -d -rเพื่อให้แน่ใจว่าถ้ามีเชลล์ตัวอื่นติดอยู่กับเซสชันหน้าจอของฉันมันจะถูกแยกออกก่อนที่ฉันจะกลับมาทำงานบนระบบปัจจุบันของฉัน

8
tmux เป็นอะนาล็อกที่ทันสมัยของหน้าจอ
zvolkov

ฉันไม่รู้เกี่ยวกับความทันสมัย ​​แต่คำนำหน้าคีย์เริ่มต้นของ tmux (Ctrl + b) ช่วยถ้าคุณคุ้นเคยกับการใช้ bash / emacs keys
sajith

2
หน้าจอค่อนข้างเท่ถ้าคุณต้องการเทอร์มินัลที่ใช้ร่วมกันด้วยเหตุผลบางประการ สร้างหน้าจอscreen -S nameและปล่อยให้เพื่อนอื่น ๆ screen -x nameของคุณเชื่อมต่อกับมันด้วย
แพทริค

1
tmuxด้วยtmuxinatorเป็นการผสมผสานที่ยอดเยี่ยมสำหรับการตั้งค่าแฟนซีในขณะที่ฉันชอบscreenเป็นวิธีแก้ปัญหาที่ง่ายและรวดเร็ว
earthmeLon

คำตอบนี้ดีที่สุด .. ฉันชอบมัน การวิจัยที่ยอดเยี่ยม
Jaffer Wilson

42

หากคุณยังไม่ได้วางแผนล่วงหน้าและตั้งค่าscreenฯลฯ ให้ทำดังต่อไปนี้:

  1. หากกระบวนการของคุณกำลังทำงานในพื้นหลัง: goto # 3, อื่น: Ctrl-Zเพื่อระงับกระบวนการพื้นหน้า สิ่งนี้จะรายงาน job # ของกระบวนการที่ถูกระงับตัวอย่างเช่น:

    [1]+  Stopped                 processName
    
  2. ส่งprocessNameไปที่พื้นหลังด้วยbg %1(ใช้อะไรก็ตามที่ job # กำลังติดตาม%) สิ่งนี้จะทำงานต่อprocessNameในพื้นหลัง

  3. ปฏิเสธ processNameด้วยหรือdisown %1 disown PIDใช้-hแฟล็กหากคุณต้องการรักษาความเป็นเจ้าของจนกว่าคุณจะยุติเชลล์ปัจจุบันของคุณ


5
ขอบคุณสำหรับสิ่งนี้! ฉันมีงานทำและคิดว่าฉันจะไม่สามารถทำงานต่อไปได้เพราะฉันไม่ได้ใช้&ตอนเริ่มทำงาน ดูเหมือนว่าจะใช้งานได้ดี!
Matt

4
มันอัศจรรย์มาก! ฉันไม่เคยรู้เลยว่า Linux สามารถให้คุณถ่ายโอนการควบคุมกระบวนการที่ใช้งานอยู่เช่นนี้ ฉันกลัวว่าแบตเตอรีของฉันจะตายในขณะที่ SSH กำลังเข้าสู่เซิร์ฟเวอร์ของฉันในระหว่างกระบวนการทำงานที่ยาวนานและนี่คือคำตอบสำหรับฉัน!
พลูโต

14

สิ่งที่คุณต้องการใช้คือหน้าจอหรือแม้แต่เสื้อคลุมที่ใช้งานง่ายรอบหน้าจอที่เรียกว่า byobu

หน้าจอช่วยให้คุณสามารถรันเซสชันเทอร์มินัลเสมือนหลายเซสชันในเซสชัน ssh เดียวกัน กวดวิชาและความช่วยเหลือหน้ามีอยู่

byobuเป็น wrapper ที่ช่วยให้สามารถเปิดหน้าจอใหม่ได้อย่างง่ายดายด้วยฟังก์ชั่นคีย์อย่างง่ายแทนการใช้คีย์ผสมจาก ctrl-a นอกจากนี้ยังแสดงบรรทัดสถานะพร้อมเทอร์มินัลเสมือนที่เปิดซึ่งสามารถตั้งชื่อได้

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

ในที่สุดภาพหน้าจอของ byobu


ฉันเปิดตัวกระบวนการบนเซิร์ฟเวอร์ของฉันภายใน Byobu Terminal โดยไม่รู้ว่ามันคืออะไร (ฉันเพิ่งค้นหา Terminal และคลิกที่ Byobu เพราะฉันไม่เคยเห็นมาก่อน) ฉันใช้ Byobu ต่อไปเพราะมันมีแถบสถานะที่มีสีสันที่ด้านล่างและฉันคิดว่ามันเท่ห์ วันนี้ฉันพบว่าตัวเองต้องการเข้าถึงเซสชันเทอร์มินัลระยะไกลผ่าน SSH สิ่งที่ฉันต้องทำคือพิมพ์ "byobu" และพบว่าเซสชันเทอร์มินัลทันที มีความสุขจริงๆที่ฉันเจอ byobu!
กรงขัง

8

มันอาจจะเป็นที่น่าสังเกตว่า

ssh -t lala screen -rxU mooจะแนบไปกับหมู่เซสชั่นบนโฮสต์lala

ssh -t lala screen -S mooจะสร้างเซสชันmooบนโฮสต์lala

และ

ssh -t lala screen -S moo quuxจะสร้างเซสชันหมู่บนโฮสต์lalaและเรียกใช้โปรแกรมquuxออกจากเซสชันเมื่อเสร็จสิ้น


3

คำถามเก่าไม่มีใครแปลกยังคงแนะนำtmuxซึ่งทำหน้าที่เป็นเสื้อคลุมสำหรับ n คอนโซลและให้เปิดจนกว่าจะจำเป็น สิ่งนี้ช่วยให้สามารถควบคุมได้มากขึ้นนอกเหนือจากฟังก์ชั่น tmux จำนวนหนึ่ง ง่ายต่อการจัดการคุณเพียงแค่เรียกใช้ tmux ซึ่งนำคุณเข้าสู่เชลล์เริ่มงาน looong จากนั้นกด ctrl + b ตามด้วย d (แยก) ( ctrl+bคือ "ok google" ของ tmux และdเป็นคำสั่งให้ปิด โดยไม่ต้องออกจากเปลือก) ใช้งานได้จริงถ้าคุณเพิ่งปิดเช่นผงสำหรับอุดรู หลังอาหารเย็นเมื่อคุณเชื่อมต่ออีกครั้งคุณสามารถเปิด tmux อีกครั้งtmux attachเพื่อดูหน้าจอตรงตามที่คุณทิ้งไว้ สิ่งที่ฉันรักคือบานหน้าต่างแยก: แล้วกดctrl+b "หากต้องการเปลี่ยนจากบานหน้าต่างหนึ่งเป็นบานหน้าต่างอื่นctrl+bแล้วกดลูกศรขึ้น / ลง


3

คุณสามารถดูคำแนะนำที่ดีได้ที่นี่: ทำให้เซสชัน SSH ของคุณทำงานต่อเมื่อคุณตัดการเชื่อมต่อ

sudo apt-get install screen

ตอนนี้คุณสามารถเริ่มเซสชันหน้าจอใหม่โดยเพียงพิมพ์หน้าจอที่บรรทัดคำสั่ง คุณจะแสดงข้อมูลบางอย่างเกี่ยวกับหน้าจอ กด Enter และคุณจะได้รับพร้อมท์ปกติ

หากต้องการยกเลิกการเชื่อมต่อ (แต่ปล่อยให้เซสชันทำงานอยู่) กดCtrl+ AและCtrl+ Dในการทดแทนต่อเนื่องทันที คุณจะเห็นข้อความ [แฝด]

เมื่อต้องการเชื่อมต่อกับเซสชันที่กำลังทำงานอยู่

screen -r

หากต้องการเชื่อมต่อกับเซสชันที่มีอยู่อีกครั้งหรือสร้างใหม่หากไม่มี

screen -D -r

ในการสร้างหน้าต่างใหม่ภายในเซสชันหน้าจอที่ใช้งาน Hit Ctrl+ Aจากนั้นCจะติดกันอย่างต่อเนื่อง คุณจะเห็นพรอมต์ใหม่

ที่จะเปลี่ยนจากหน้าจอหน้าต่างหนึ่งไปยังอีก ตีCtrl+ Aแล้วCtrl+ Aต่อเนื่องทันที

ในการแสดงรายการหน้าต่างที่เปิดอยู่บนหน้าจอ Hit Ctrl+ Aและจากนั้นก็Wต่อเนื่องทันที


คุณสามารถใช้<kbd>Ctrl</kbd>เพื่อแสดงชื่อเป็นแป้นคีย์บอร์ด
Tomasz

1

ฉันใช้ NX NoMachine ซึ่งฟรีสำหรับฉันเพราะเป็นแค่ฉันคนเดียว โดยพื้นฐานแล้วจะรันเซสชัน X บนเซิร์ฟเวอร์ซึ่งคุณสามารถเชื่อมต่อและยกเลิกการเชื่อมต่อจากซ้ำไปซ้ำมา เซสชัน X ยังคงทำงานต่อเมื่อคุณไม่ได้เชื่อมต่อ การเชื่อมต่อสามารถทำได้จากทุกที่ คุณสามารถเลือกระหว่างหน้าต่างแบบลอยหรือหน้าต่างเดียวที่มีทั้งเดสก์ท็อป (เช่นเดสก์ท็อป Gnome ทั้งหมด) ไคลเอนต์ (ซึ่งคุณจะเรียกใช้บนแล็ปท็อปของคุณ) สามารถทำงานบน Linux, MacOS, Solaris หรือ Microsoft Windows ในกรณีหลังหากคุณเลือกหน้าต่างลอยหน้าต่างจะปรากฏเป็นรายบุคคลบนแถบงานของ Windows

ฉันใช้แล็ปท็อป Windows XP ของฉัน (ซึ่งฉันต้องการสำหรับฮาร์ดแวร์เฉพาะของ Windows ที่ฉันมี) เป็นส่วนหน้าสำหรับเซิร์ฟเวอร์ Linux สองตัวที่ใช้ NX Nomachine ฉันยังสามารถพิมพ์ไปยังเครื่องพิมพ์ที่เชื่อมต่อกับแล็ปท็อป Windows ของฉันจาก Linux

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