シェルを閉じると、「scp」転送は閉じますか?


29

私はscp(あるリモートサーバーから別のリモートサーバーへ)転送していますが、それは非常に大きいです。

だから、このコマンドを実行したコンピューターを閉じたいのですが、これで転送が終了しますか?私が持っていますsshプログラムビット演算を使用して、シェルへのアクセスを。

回答:


34

多くの解決策があります。

プロセスの背景と否認

  1. リモートサーバーに対してsshターミナルを開きます。
  2. 開始scpいつものように転送します。
  3. scpプロセスのバックグラウンド(Ctrl+ Z、次にコマンドbg)。
  4. バックグラウンドプロセスを無視します(disown)。
  5. セッションを終了すると(exit)、プロセスは引き続きリモートマシンで実行されます。

このアプローチの欠点の1つは、stdoutおよびstderrのファイル記述子に、sshセッションのttyへの参照がまだ含まれていることです。このため、終了しようとすると端末がハングすることがあります。これを回避するには~.、sshクライアントを強制的に閉じるように入力します(エスケープシーケンスは新しい行に従う必要があります...も参照~?)。放棄するプロセスがstdoutまたはstderrに書き込みを行う場合、ttyバッファーがいっぱいになるとプロセスが途中で終了する可能性があります。

スクリーンセッションを作成して切り離す

GNU Screenを使用して、リモートターミナルセッションを作成できます。リモートターミナルセッションは、セッションからログアウトした後、サーバー上で切り離して実行し続けることができます。その後、後でサーバーに再度ログインして、セッションに再接続できます。

  1. sshを介してリモートサーバーにログインします。
  2. スクリーンセッションを開始しますscreen -D -R <session_name>
  3. 開始scpいつものように転送します。
  4. デタッチしてscreenセッションCtrl+ Aその後d
  5. sshセッションを終了します(exit

セッションに再接続するには:

  1. sshを介してリモートサーバーにログインします。
  2. スクリーンセッションに再接続します。 screen -D -R <session_name>

ハングアップなしでコマンドを実行する

を使用して回答を参照してくださいnohup

タスクスケジューラを使用する

これは、自動化する定期的なタスクの場合に最適なソリューションです。

使用crontabatまたはbatch転送をスケジュールします。


こんにちは、Damien、さまざまな回答とフォーマットに感謝します。しかし、なぜ-D -Rフラグを開始するように指定したのかを明確にしたかったのですscreen。私はマニュアルページを読みましたが、理解するのに役立ちませんでした: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andyマニュアルには、-DRの機能が明確に記載されています。基本的に、既に実行中のScreenセッションがある場合、新しいセッションを作成するのではなく、再接続します(ユーザーがSSH経由でログインしている場合でも、キックアウトします。悪いネットワーク接続に。)
ダミアンÓCeallaigh

1
セッション名の指定はオプションです。
ダミアンÓCeallaigh

[OK]を私は理解してだと思うが、私は(多分誤って)何だと思ったと思うscreen -r <session>ので...やった-DRだけのことが異なっている-rという点で、それは彼らを追い出すことができますか?別のユーザーがその上にいる場合、再接続して失敗するだけではありません。
hello_there_andy

確実にするためにいくつかのテストを行いました。-Dは-dと同じことを行いますが、既存のScreenセッションをデタッチするだけでなく、SSH接続も閉じます(ユーザーをログアウトします)。-rはセッションを再接続します。-Rは既存のセッションを再アタッチしますが、セッションが存在しない場合は新しいセッションを作成します(再アタッチするセッションがない場合、-rは失敗します)。したがって、前の説明では少し不正確でした。
ダミアンÓ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

上記のように、次のようにscreenコマンドを使用できます。

  • 画面を作成

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 / file

コマンドを一時的に停止します

Ctrl + z

コマンドをバックグラウンドに配置して、次のように入力します。

bg

次の方法でプロセスを確認できます。

仕事

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.