Apakah transfer `scp` ditutup ketika saya menutup shell?


29

Saya memiliki scptransfer (dari satu server jauh ke yang lain), itu cukup besar.

Jadi mungkin saya ingin menutup komputer dari mana saya menjalankan perintah ini, apakah ini akan mengakhiri transfer? Saya memiliki sshakses ke shell menggunakan program Bitwise.

Jawaban:


34

Ada sejumlah solusi.

Background & Menolak Proses

  1. Buka terminal ssh ke server jauh.
  2. Mulai scptransfer seperti biasa.
  3. Latar belakang proses scp ( Ctrl+ Z, lalu perintah bg.)
  4. Menolak proses latar belakang ( disown).
  5. Hentikan sesi ( exit) dan proses akan terus berjalan pada mesin jarak jauh.

Satu kelemahan dari pendekatan ini adalah bahwa deskriptor file untuk stdout dan stderr masih akan berisi referensi ke tty sesi ssh Anda. Terminal mungkin hang ketika Anda mencoba keluar karena ini. Anda dapat mengatasi ini dengan mengetik ~.untuk memaksa menutup klien ssh Anda (bahwa urutan pelarian harus mengikuti baris baru ... lihat juga ~?). Jika proses yang Anda tinggalkan menulis ke stdout atau stderr, proses tersebut dapat keluar sebelum waktunya jika buffer tty memenuhi batas.

Buat Sesi Layar dan Lepaskan

Layar GNU dapat digunakan untuk membuat sesi terminal jarak jauh, yang dapat dilepas dan terus berjalan di server setelah Anda keluar dari sesi. Anda kemudian dapat login kembali ke server di kemudian hari dan pasang kembali ke sesi.

  1. Masuk ke server jauh melalui ssh.
  2. Mulai sesi layar screen -D -R <session_name>,.
  3. Mulai scptransfer seperti biasa.
  4. Lepaskan sesi layar dengan Ctrl+ Alalu d.
  5. Hentikan sesi ssh ( exit)

Untuk memasang kembali sesi:

  1. Masuk ke server jauh melalui ssh.
  2. Pasang kembali ke sesi layar, screen -D -R <session_name>

Jalankan Perintah tanpa Hangup

Lihat jawabannya menggunakan nohup.

Gunakan Penjadwal Tugas

Ini adalah solusi terbaik jika ini adalah jenis tugas berkala yang ingin Anda otomatisasi.

Gunakan crontab,, atatau batchuntuk menjadwalkan transfer.


Hai Damien, terima kasih atas berbagai jawaban dan pemformatan yang bagus. Tapi saya ingin kejelasan tentang mengapa Anda menentukan -D -Rbendera dimulai screen. Saya membaca halaman manual dan itu tidak membantu saya memahami: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy Manual menyatakan apa yang dilakukan -DR dengan jelas. Pada dasarnya, jika Anda memiliki sesi Layar sudah berjalan, itu akan menyambungkan kembali ke sana daripada membuat sesi baru (bahkan jika pengguna masuk ke sana melalui SSH - itu akan menendang mereka keluar, yang berguna jika pengguna tergantung karena ke koneksi jaringan yang buruk.)
Damien Ó Ceallaigh

1
Perhatikan bahwa menentukan nama sesi adalah opsional.
Damien Ó Ceallaigh

Ok saya pikir saya mengerti, tapi saya kira saya pikir (mungkin salah) itulah yang screen -r <session>melakukan ... jadi -DRberbeda hanya -rdalam hal itu dapat mengusir mereka? Bukan hanya menyambungkan kembali dan gagal jika ada pengguna lain di dalamnya.
hello_there_andy

Saya melakukan beberapa pengujian untuk memastikan. -D melakukan apa yang dilakukan -d, kecuali itu juga akan menutup koneksi SSH (logout pengguna) selain hanya melepaskan setiap sesi Layar yang ada. - ulangi sesi. -R menempelkan kembali sesi yang ada, tetapi akan membuat sesi baru jika tidak ada (-r akan gagal jika tidak ada sesi untuk disambungkan kembali.) Jadi, saya sedikit tidak akurat dalam deskripsi saya sebelumnya.
Damien Ó Ceallaigh

10

Anda dapat menggunakan nohup(1), yaitu, melakukan sesuatu seperti:

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

Ini akan membuat output dari nohup.out. Maka Anda bisa keluar dengan aman.


Pada &akhirnya membuat perbedaan bagi saya! Terima kasih!
winklerrr

6

Ya, itu akan dihentikan. Solusi untuk menjaga sesi terminal tetap hidup tanpa konektivitas adalah screenprogram:

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

Seperti yang dikatakan di atas, Anda dapat menggunakan perintah layar, misalnya:

  • Buat layar

user@server:~$ screen -S bigscptransfer

  • Anda sekarang di layar

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

  • Lepaskan dari layar menggunakan CTRL+ Alalu tekanD

[detached from 5899.bigscptransfer]

  • Lanjutkan sesi saat Anda membutuhkannya dengan:

user@server:~$ screen -r bigscptransfer


-1

nohup scp shinto @ sumber: / home / data roose@target.example.com: / var / tmp / file

hentikan sementara perintah dengan

CTRL + z

letakkan di latar belakang perintah, ketik:

bg

kamu dapat memeriksa prosesnya dengan:

pekerjaan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.