รันคำสั่ง nohup บน SSH จากนั้นตัดการเชื่อมต่อ


46

ฉันต้องการรันสคริปต์start.shบนเซิร์ฟเวอร์ระยะไกลซึ่งรันสิ่งนี้:

nohup node server.js &

อย่างไร้เดียงสาฉันเรียก SSH เช่นนี้

ssh myserver <<EOF
./start.sh &
EOF

สิ่งนี้จะเริ่มต้นสคริปต์ แต่จะไม่เชื่อมต่อกับเซสชัน ฉันต้องการทำตามขั้นตอนนี้ด้วยคำสั่งอื่น ๆ ในสคริปต์ดังนั้นจึงไม่ดี

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

คำตอบ:


40

คุณพบวิธีที่ถูกต้องแล้วที่นี่เอกสาร

หมายเหตุ : คุณสามารถใส่ ssh (ไคลเอ็นต์) เป็นพื้นหลังได้โดยวาง & ท้ายที่สุด แต่คุณจะไม่เห็นผลลัพธ์ หากคุณต้องการทำเช่นนี้จริงๆให้เปลี่ยนเส้นทาง stdout / stderr ไปยังไฟล์ในกรณีที่คุณต้องการตรวจสอบการตอบสนองจากโฮสต์ระยะไกล

โดยทั่วไปคุณสามารถทำได้ทั้งสองวิธี:

รันคำสั่ง {, s} โดยตรง

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

หรือ

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

หมายเหตุ : &&ต้องใช้คำสั่งแรกเพื่อส่งกลับ 0 ก่อนดำเนินการวินาที

ใช้เอกสารที่นี่

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

3 ตัวเลือกข้างต้นควรใช้งานได้สำหรับคุณ

นอกจากนี้ลองดูคำตอบที่นี่: https://askubuntu.com/a/348921/70270


ขอบคุณ - > /dev/nullดังนั้นบิตที่ผมหายไปเป็นจริงๆ
Steve Bennett

ไม่ได้จริงๆ> /dev/null 2>&1คือการยกเลิกการส่งออกใด ๆ stdout / stderr โดยเปลี่ยนเส้นทางไปยังหลุมดำฮ่า ๆ
เทอร์รี่วัง

5
โปรดทราบว่าฉันขอแนะนำให้ใช้ >> แทนที่จะเพียงแค่> เพื่อเขียนไปยังล็อกไฟล์ มิฉะนั้นคุณจะได้รับข้อผิดพลาดจากการเรียกใช้ครั้งสุดท้ายเท่านั้น
Alexis Wilke

ถูกต้องหรือไม่ถ้าฉันเพียงแค่เริ่มต้นคำสั่งเหมือนกับnohup command2 >> /path/to/command2.log 2>&1 &ในเทอร์มินัลแล้วปิดเทอร์มินัลว่ากระบวนการหายไปหรือไม่
ลุค

1
@TerryWang ตัวอย่างที่สองจะไม่ทำงานกับเครื่องหมายแอมเปอร์
tsionyx

7

ทำไมไม่เพียงแค่ tmux หรือหน้าจอและทำได้ด้วยล่ะ ตัวอย่างเช่น:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

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


2
ไม่เหมาะกับสิ่งที่ฉันต้องการซึ่งเป็นคำสั่งเดียวที่สามารถเรียกใช้บนแล็ปท็อปของฉันซึ่งจะเชื่อมต่อแยกคำสั่งแล้วตัดการเชื่อมต่อ
Steve Bennett

3
ssh node "nohup sleep 10 &"

ไม่ได้ทำงานในโหมด daemon ทำให้การเชื่อมต่อเซสชัน ssh ของคุณ เซสชัน Ssh จะกลับมาภายใน 10 วินาทีแม้ว่าคุณจะไม่ได้ใช้งาน

เหตุผลก็คือ stdout ระยะไกลและ stderr ยังคงเชื่อมต่อกับเซสชันของคุณ มันช่วยให้เซสชั่น SSH มีชีวิตอยู่ nohup ไม่ได้ช่วย

นี้:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

ส่งคืนทันที มันจะเริ่มกระบวนการระยะไกลด้วย nohup และออกจากเซสชัน ssh ทันที


นี่เป็นปัญหาของเรา เรามี 1> file.log เท่านั้น ssh บนเครื่องเดียวติดอยู่ กระบวนการในเครื่อง 'โหนด' กำลังทำงานอยู่ เมื่อเราเพิ่ม 2> & 1 ก่อนการปิด & นั่นทำให้ ssh ยกเลิกการเชื่อมต่อ
Lee Meador

2

แบบฟอร์มสั้น:

ssh host "(command 1; command 2; ...) &>/dev/null &"

ปรากฏว่า bash นั้นทำการแยกออกจากเทอร์มินัลดังนั้นจึงไม่จำเป็นต้องมี ฉันรัน Ubuntu 14.04 x86_64, ทุบตี 4.3.11


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

ดูเหมือนจะใช้งานไม่ได้ nohup; เพียงแค่ส่งข้อร้องเรียนเกี่ยวกับข้อโต้แย้งที่ขาดหายไป
Steve Bennett

@DavidFoerster ไม่คิดว่าทำไมถ้าcommand 1; command 2; ...เป็นเพราะสคริปต์ OP ต้องการทำงาน OP ยังสามารถใช้กรณีพิเศษของคำตอบนี้:ssh myserver ./start.sh &>/dev/null &
Alek_A
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.