Un transfert `scp` se ferme-t-il lorsque je ferme le shell?


29

J'ai un scptransfert (d'un serveur distant à un autre), c'est assez gros.

Alors peut-être que je veux fermer l'ordinateur à partir duquel j'ai exécuté cette commande, cela mettra-t-il fin au transfert? J'ai sshaccès au shell en utilisant le programme Bitwise.

Réponses:


34

Il existe plusieurs solutions.

Contexte et renoncer au processus

  1. Ouvrez le terminal ssh sur le serveur distant.
  2. Commencez le scptransfert comme d'habitude.
  3. Contexte du processus scp ( Ctrl+ Z, puis la commande bg.)
  4. Désavoue le processus en arrière-plan ( disown).
  5. Mettez fin à la session ( exit) et le processus continuera de s'exécuter sur la machine distante.

Un inconvénient de cette approche est que les descripteurs de fichiers pour stdout et stderr contiendront toujours des références au tty de votre session ssh. Le terminal peut se bloquer lorsque vous essayez de quitter à cause de cela. Vous pouvez contourner cela en tapant ~.pour forcer la fermeture de votre client ssh (cette séquence d'échappement doit suivre une nouvelle ligne ... voir aussi ~?). Si le processus que vous abandonnez écrit sur stdout ou stderr, le processus peut se terminer prématurément si le tampon tty est trop plein.

Créer une session d'écran et la détacher

L'écran GNU peut être utilisé pour créer une session de terminal distant, qui peut être détachée et continuer à s'exécuter sur le serveur après vous être déconnecté de la session. Vous pouvez ensuite vous reconnecter au serveur à une date ultérieure et vous reconnecter à la session.

  1. Connectez-vous au serveur distant via ssh.
  2. Démarrer une session de l' écran, screen -D -R <session_name>.
  3. Commencez le scptransfert comme d'habitude.
  4. Détachez la session écran avec Ctrl+ Apuis d.
  5. Mettre fin à la session ssh ( exit)

Pour rattacher à la session:

  1. Connectez-vous au serveur distant via ssh.
  2. Rattacher à la session écran, screen -D -R <session_name>

Exécutez la commande sans raccrocher

Voir la réponse en utilisant nohup.

Utiliser un planificateur de tâches

Il s'agit de la meilleure solution s'il s'agit d'une sorte de tâche périodique que vous souhaitez automatiser.

Utilisez crontab, atou batchpour planifier le transfert.


Salut Damien, merci pour la belle variété de réponses et de formatage. Mais je voulais un peu de clarté sur la raison pour laquelle vous avez spécifié le -D -Rdémarrage des drapeaux screen. J'ai lu la page de manuel et cela ne m'a pas aidé à comprendre: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy Le manuel indique clairement ce que -DR fait. Fondamentalement, si une session Screen est déjà en cours d'exécution, elle s'y rattachera plutôt que de créer une nouvelle session (même si un utilisateur y est connecté via SSH - cela les expulsera, ce qui est utile si l'utilisateur est suspendu en raison à une mauvaise connexion réseau.)
Damien Ó Ceallaigh

1
Notez que la spécification d'un nom de session est facultative.
Damien Ó Ceallaigh

D' accord , je pense que je comprends, mais je suppose que je pensais (peut - être à tort) est ce qui a screen -r <session>fait ... alors le -DRest différent juste -ren ce qu'elle peut les chasser? Non seulement rattacher et échouer si un autre utilisateur est dessus.
hello_there_andy

J'ai fait des tests pour en être certain. -D fait ce que -d fait, sauf qu'il ferme également la connexion SSH (déconnecte l'utilisateur) en plus de détacher toutes les sessions Screen existantes. -r rattache la session. -R rattache une session existante, mais crée une nouvelle session si elle n'existe pas (-r échouerait s'il n'y a pas de session à rattacher.) Donc, j'étais légèrement inexact dans ma description précédente.
Damien Ó Ceallaigh

10

Vous pouvez utiliser nohup(1), par exemple, faire quelque chose comme:

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

Cela créera une sortie de nohup.out. Ensuite, vous pouvez vous déconnecter en toute sécurité.


La &fin a fait la différence pour moi! Merci!
winklerrr

6

Oui, il sera résilié. La solution pour maintenir la session de terminal en vie sans connectivité est le screenprogramme:

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

Comme indiqué ci-dessus, vous pouvez utiliser la commande d'écran, par exemple:

  • Créer un écran

user@server:~$ screen -S bigscptransfer

  • Vous êtes maintenant à l'écran

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

  • Détachez-vous de l'écran en utilisant CTRL+ Apuis appuyez surD

[detached from 5899.bigscptransfer]

  • Reprenez la session lorsque vous en avez besoin avec:

user@server:~$ screen -r bigscptransfer


-1

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

arrêter temporairement la commande avec

CTRL + z

mettre en arrière-plan la commande, tapez:

bg

vous pouvez vérifier le processus avec:

emplois

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.