คำสั่ง SSH ที่รันมายาวนาน - กลยุทธ์ที่ดีกว่า


2

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

คำสั่งของฉันใช้งานantเป้าหมายเช่นนี้:

ssh -tt user@machine 'cd /thedir; export DISPLAY=:80; ant clean test'

antคำสั่งอาจใช้เวลาถึงหนึ่งชั่วโมง

ฉันคิดว่านี่เป็นกลยุทธ์ที่ไม่ดีเนื่องจากเครือข่ายใด ๆ ที่สามารถเกิดขึ้นได้และทำให้การเชื่อมต่อของฉันยุ่งเหยิง ทุกคนสามารถแนะนำวิธีการอื่นได้หรือไม่? เป้าหมายของฉันคือ:

  1. ลูกค้าของฉันรอให้คำสั่งเสร็จสิ้น
  2. ฉันยังคงได้รับผลลัพธ์จากคำสั่ง
  3. หากการเครือข่ายเกิดขึ้นฉันยังสามารถตรวจสอบและรอให้ความคิดเห็นสิ้นสุดลงได้

ความช่วยเหลือหรือข้อเสนอแนะใด ๆ ที่ชื่นชมอย่างมาก

แก้ไข: ฉันใช้สคริปต์ทุบตีเต็มรูปแบบ ... ฉันไม่ต้องการซับในหรืออะไรแบบนั้น


1
อาจเป็นประโยชน์หากใช้ 'หน้าจอ' เพื่อให้เมื่อคุณยกเลิกการเชื่อมต่อคุณสามารถเชื่อมต่อเซสชันอีกครั้งโดยเริ่มต้นการส่งออกใหม่ gnu.org/software/screen
Frank Thomas

1
@ Frankankomas - ใช่ - เพิ่มคำตอบนั้น รับคะแนนโหวตบางส่วน
Doug Harris

น่าสนใจฉันไม่คุ้นเคยscreenและอาจเป็นสิ่งที่ฉันกำลังมองหา ฉันจะขุดบ้าง
ฌอน Adkinson

คำตอบ:


2

คุณสามารถลองใช้คำสั่งในพื้นหลัง (แยกออกจากเซสชันผู้ใช้ของคุณ) และส่งผลให้ตัวคุณเองทางอีเมล ค่อนข้างชอบ:

ssh -tt user@machine 'cd /thedir; nohup ant clean test 2>&1 | mail -s "The cleanup was completed." your-email@exmaple.com'

ฉันยังไม่ได้ทดสอบสิ่งนี้


ฉันหวังว่าสคริปต์ลูกค้าของฉันจะรอให้คำสั่งดำเนินการจนเสร็จสิ้น นี่จะเป็นสคริปต์ที่ดีเพียงเพื่อให้ฉันรู้ว่าเมื่อเสร็จสิ้น แต่เป้าหมายของฉันแตกต่างกันเล็กน้อย
Sean Adkinson

@BigSean: ประเด็นก็คือคุณอาจถูกตัดการเชื่อมต่อเนื่องจาก "network blips" ดังนั้นหากคุณไม่ได้เชื่อมต่อลูกค้าของคุณควรจะรออะไร? ฉันสามารถจินตนาการได้ว่าจะซับซ้อนมากขึ้นเช่นการบันทึกไฟล์และดูบันทึกนั้นจนกว่าคำสั่งจะออกและในกรณีที่คุณถูกตัดการเชื่อมต่อคุณยังมีบันทึกอยู่ หรือฉันเข้าใจผิดเกี่ยวกับเป้าหมาย?
Der Hochstapler

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

@BigSean: ในกรณีนี้ฉันจะเขียนอะไรที่ซับซ้อนกว่านี้ แต่ท้ายที่สุดฉันต้องการบรรลุวิธีแก้ปัญหาที่ไม่ต้องพึ่งพาการเชื่อมต่อ SSH นี้เลย
Der Hochstapler

2

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

ด้วยวิธีนี้เมื่อ hiccupps เครือข่ายของคุณการเชื่อมต่ออัตโนมัติจะเชื่อมต่ออีกครั้งและหน้าจอจะเชื่อมต่อกับเชลล์สคริปต์ของคุณอีกครั้ง

localhost>$ autossh -t remotehost 'screen -Rd'
remotehost>$ scriptname

ด้วยวิธีนี้เมื่อ ssh ตาย autossh จะเชื่อมต่อใหม่และแนบเซสชันหน้าจออีกครั้งโดยอัตโนมัติ

http://noone.org/blog/English/Computer/Shell/Perfect%20Team:%20autossh%20and%20GNU%20Screen.html

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