การถ่ายโอน `scp 'ปิดเมื่อฉันปิดเชลล์หรือไม่


29

ฉันมีการscpถ่ายโอน (จากเซิร์ฟเวอร์ระยะไกลหนึ่งไปยังอีก) นั่นค่อนข้างใหญ่

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

คำตอบ:


34

มีวิธีแก้ปัญหามากมาย

พื้นหลังและปฏิเสธกระบวนการ

  1. เปิด terminal ssh ไปยังเซิร์ฟเวอร์ระยะไกล
  2. เริ่มต้นการscpถ่ายโอนตามปกติ
  3. พื้นหลังกระบวนการ scp ( Ctrl+ Zจากนั้นคำสั่งbg)
  4. บอกเลิกกระบวนการพื้นหลัง ( disown)
  5. ยุติเซสชัน ( exit) และกระบวนการจะยังคงทำงานบนเครื่องระยะไกล

ข้อเสียอย่างหนึ่งของวิธีการนี้คือไฟล์ descriptor สำหรับ stdout และ stderr จะยังคงมีการอ้างอิงไปยัง tty ของ ssh session ของคุณ เทอร์มินัลอาจค้างเมื่อคุณพยายามออกเนื่องจากสิ่งนี้ คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยพิมพ์~.เพื่อบังคับให้ปิดไคลเอ็นต์ ssh ของคุณ (ลำดับการยกเว้นนั้นจะต้องเป็นไปตามบรรทัดใหม่ ... ดูเพิ่มเติม~?) หากกระบวนการที่คุณละทิ้งการเขียนไปยัง stdout หรือ stderr กระบวนการอาจออกก่อนเวลาอันควรหากบัฟเฟอร์ tty ล้น

สร้างเซสชันของหน้าจอและแยกออก

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

  1. ล็อกอินเข้าสู่รีโมตเซิร์ฟเวอร์ผ่าน ssh
  2. screen -D -R <session_name>เริ่มเซสชั่นหน้าจอ
  3. เริ่มต้นการscpถ่ายโอนตามปกติ
  4. ถอดเซสชั่นหน้าจอด้วยCtrl+ แล้วAd
  5. สิ้นสุดเซสชัน ssh ( exit)

หากต้องการแนบเซสชันอีกครั้ง:

  1. ล็อกอินเข้าสู่รีโมตเซิร์ฟเวอร์ผ่าน ssh
  2. กลับไปที่เซสชันหน้าจอ screen -D -R <session_name>

เรียกใช้คำสั่งโดยไม่ต้องแฮงค์

nohupดูคำตอบโดยใช้

ใช้ Task Scheduler

นี่เป็นวิธีแก้ปัญหาที่ดีที่สุดหากนี่เป็นภารกิจที่คุณต้องการทำให้เป็นอัตโนมัติ

การใช้งานcrontab, atหรือbatchเพื่อกำหนดตารางการถ่ายโอน


สวัสดีดาเมียนขอบคุณสำหรับคำตอบและการจัดรูปแบบที่หลากหลาย แต่ผมอยากมีความชัดเจนบางอย่างเกี่ยวกับเหตุผลที่คุณระบุธงเริ่มต้น-D -R screenฉันอ่าน man page และมันก็ไม่ได้ช่วยให้ฉันเข้าใจ: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy คู่มือระบุสิ่งที่ -DR ทำได้ชัดเจน โดยทั่วไปหากคุณมีเซสชันของหน้าจอทำงานอยู่แล้วจะแนบกลับไปที่เซสชันแทนที่จะสร้างเซสชันใหม่ (แม้ว่าผู้ใช้จะลงชื่อเข้าใช้ผ่านทาง SSH - มันจะเตะมันออกไปซึ่งมีประโยชน์ถ้าผู้ใช้กำลังค้างอยู่เนื่องจาก การเชื่อมต่อเครือข่ายไม่ดี)
Damien Ó Ceallaigh

1
โปรดทราบว่าการระบุชื่อเซสชันเป็นทางเลือก
ดาเมียนÓ Ceallaigh

ตกลงฉันคิดว่าฉันเข้าใจ แต่ฉันคิดว่าฉันคิดว่า (อาจผิด) นั่นคือสิ่งที่screen -r <session>ทำ ... ดังนั้นสิ่งที่-DRแตกต่างจากการ-rที่มันสามารถกำจัดพวกเขาได้? ไม่เพียงแค่ติดตั้งใหม่และล้มเหลวหากผู้ใช้รายอื่นอยู่ในนั้น
hello_there_andy

ฉันทำการทดสอบบางอย่างเพื่อให้แน่ใจ -D ทำในสิ่งที่ -d ทำยกเว้นว่ามันจะปิดการเชื่อมต่อ SSH (ออกจากระบบผู้ใช้) นอกเหนือจากการแยกเซสชันหน้าจอที่มีอยู่ออก -r แนบเซสชัน -R แนบเซสชันที่มีอยู่แล้ว แต่จะสร้างเซสชันใหม่หากไม่มีอยู่ (-r จะล้มเหลวหากไม่มีเซสชันที่ต้องติดตั้งใหม่) ดังนั้นฉันจึงไม่ถูกต้องเล็กน้อยในคำอธิบายก่อนหน้านี้
Damien Ó Ceallaigh

10

คุณสามารถใช้nohup(1)คือทำสิ่งที่ชอบ:

nohup scp alice@source:/the/answer/of/all bob@target.example.com:/var/tmp/42 &

nohup.outนี้จะสร้างผลผลิตของ จากนั้นคุณสามารถออกจากระบบได้อย่างปลอดภัย


&ที่สิ้นสุดสร้างความแตกต่างสำหรับฉัน! ขอบคุณ!
winklerrr

6

ใช่มันจะถูกยกเลิก วิธีแก้ปัญหาเพื่อรักษาเซสชันเทอร์มินัลโดยไม่ต้องเชื่อมต่อคือscreenโปรแกรม:

SCREEN(1)                                                            SCREEN(1)

NAME
       screen - screen manager with VT100/ANSI terminal emulation

SYNOPSIS
       screen [ -options ] [ cmd [ args ] ]
       screen -r [[pid.]tty[.host]]
       screen -r sessionowner/[[pid.]tty[.host]]

DESCRIPTION
       Screen is a full-screen window manager that multiplexes a physical ter‐
       minal between several processes (typically interactive  shells).   Each
       virtual terminal provides the functions of a DEC VT100 terminal and, in
       addition, several control functions from the ISO 6429  (ECMA  48,  ANSI
       X3.64)  and ISO 2022 standards (e.g. insert/delete line and support for
       multiple character sets).  There is a  scrollback  history  buffer  for
       each virtual terminal and a copy-and-paste mechanism that allows moving
       text regions between windows.

2

ดังกล่าวข้างต้นคุณสามารถใช้คำสั่งหน้าจอตัวอย่างเช่น:

  • สร้างหน้าจอ

user@server:~$ screen -S bigscptransfer

  • ตอนนี้คุณอยู่ในหน้าจอ

ser@server:~$ scp bigfile.dat server2:.

  • แยกออกจากหน้าจอโดยใช้CTRL+ Aจากนั้นดันD

[detached from 5899.bigscptransfer]

  • ดำเนินการเซสชันต่อเมื่อคุณต้องการด้วย:

user@server:~$ screen -r bigscptransfer


-1

nohup scp shinto @ source: / home / data roose@target.example.com: / var / tmp / ไฟล์

หยุดคำสั่งชั่วคราวด้วย

CTRL + Z

ใส่คำสั่งแบ็คกราวน์พิมพ์:

BG

คุณสามารถตรวจสอบกระบวนการด้วย:

งาน

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