web-dev-qa-db-ja.com

SSHセッションが切断された後もプロセスを実行し続ける

家に帰る前にキックオフしたい長時間のプロセスがある場合があるので、サーバーへのSSHセッションを作成してプロセスを開始しますが、ラップトップを閉じて家に帰り、後で夕食後にしたいです。仕事を辞める前に、私が始めたプロセスを確認してください。 SSHでどうすればよいですか?私の理解では、SSH接続を切断すると、サーバー上のログインセッションも切断されるため、長時間実行されているプロセスが強制終了されます。

216

Nohupを使用して、プロセスがハングアップ信号を無視するようにします。

$ Nohup long-running-process &
$ exit
217
Warren Young

GNU Screenを使用したい。それはすごい!

ssh [email protected]
screen               #start a screen session
run-a-long-process

CTRL+a 、 d スクリーンセッションから切り離すには

exit                 #disconnect from the server, while run-a-long-process continues

ラップトップに戻ったとき:

ssh [email protected]
screen -r            #resume the screen session

次に、長期実行プロセスの進行状況を確認します。

screenは非常に包括的なツールであり、私が説明した以上のことができます。スクリーンセッション中にctrl + aを試しますか?いくつかの一般的なコマンドを学びます。おそらく最も一般的なものは次のとおりです。

  • CTRL+a 、 c 新しいウィンドウを作成するには
  • CTRL+a 、 n スクリーンセッションの次のウィンドウに切り替えるには
  • CTRL+a 、 p スクリーンセッションで前のウィンドウに切り替えるには
  • さまざまなシステムからログインすると、誤って別のコンピュータのアクティブなスクリーンセッションに接続したままになる可能性があります。そのため、私は常にscreen -d -r別のシェルが自分のスクリーンセッションに接続されている場合、現在のシステムで再開する前に切り離されることを確認します。
143
Sandy

事前に計画を立てておらず、screenなどを設定していない場合は、次のようにしてください。

  1. プロセスがバックグラウンドで実行されている場合:#3に移動し、そうでない場合:フォアグラウンドプロセスを一時停止するにはCtrl-Z。これにより、中断されたプロセスのジョブ番号が報告されます。次に例を示します。

    [1]+  Stopped                 processName
    
  2. processNamebg %1を使用してバックグラウンドに送信します(#が%をフォローしているジョブを使用して)。これにより、バックグラウンドでprocessNameが再開されます。

  3. DisownprocessName with disown %1またはdisown PID。現在のシェルを終了するまで所有権を維持したい場合は、-hフラグを使用します。

42
Mike Covington

使用したいのは、screen、またはさらに優れた、byobuと呼ばれる使いやすい画面ラッパーです。

画面では、同じsshセッションで複数の仮想端末セッションを実行できます。 チュートリアル および ヘルプページ が利用可能です。

byob は、ctrl-aからのキーの組み合わせの代わりに単純なファンクションキーで新しい画面を簡単に開くことができるラッパーです。また、名前を付けることができる開いているすべての仮想端末のステータス行も表示されます。

もう1つの素晴らしい機能は、SSH接続が切断されている間、すべての画面が表示され続けるという事実です。もう一度sshを介して接続し、byobuを呼び出すだけで、すべてが以前と同じです。

ついにいくつかの スクリーンショット byobuの。

15
txwikinger

それは注目に値するかもしれません

ssh -t lala screen -rxU moomooホストのセッションにアタッチしますlala

ssh -t lala screen -S mooは、ホスト上にmooセッションを作成しますlala

そして

ssh -t lala screen -S moo quuxは、ホストにmooセッションを作成しますlalaプログラムを実行しますquux、完了時にセッションを終了します。

9
cjac

ここで良いガイドを見つけることができます:切断時にSSHセッションを実行し続ける

Sudo apt-get install screen

これで、コマンドラインでscreenと入力するだけで、新しいスクリーンセッションを開始できます。画面に関する情報が表示されます。 Enterキーを押すと、通常のプロンプトが表示されます。

切断する(ただし、セッションを実行したままにする)ヒット Ctrl + A その後 Ctrl + D すぐに続けて。 [detached]というメッセージが表示されます

すでに実行中のセッションに再接続するには

screen -r

既存のセッションに再接続するか、存在しない場合は新しいセッションを作成します

screen -D -r

実行中のスクリーンセッション内に新しいウィンドウを作成するにはヒット Ctrl + A その後 C すぐに続けて。新しいプロンプトが表示されます。

1つの画面ウィンドウから別のウィンドウに切り替えるにはヒット Ctrl + A その後 Ctrl + A すぐに続けて。

開いている画面ウィンドウを一覧表示するにはヒット Ctrl + A その後 W すぐに続けて

古い質問、奇妙なことで誰も助言しなかった tmux 、これはn個のコンソールのラッパーとして機能し、必要になるまで開いたままにします。これにより、tmuxが持つ多くの機能に加えて、より多くの制御が可能になります。管理は簡単で、tmuxを実行してシェルを起動し、looongジョブを開始してから、ctrl + bを押してからd(切り離し)を押します(ctrl+bはtmuxの「ok google」であり、 dは、シェルを終了せずに閉じるコマンドです。これは、たとえばPuTTYを閉じるだけで実際に機能します。夕食後、再度接続すると、tmux attachを使用してtmuxを再び開き、画面をそのまま表示できます。私が気に入っているのは、ペインを分割することです:ctrl+b、次に"を押します。あるペインから別のペインに変更するには、ctrl+bを押してから、上/下矢印を押します。

4
nnsense

私はNX NoMachineを使用していますが、これは私だけなので無料です。基本的に、サーバー上でXセッションを実行し、何度も接続および切断を行うことができます。 Xセッションは、接続していないときも実行され続けます。どこからでも接続できます。フローティングウィンドウ、またはデスクトップ全体を含む単一のウィンドウ(完全なGnomeデスクトップなど)を選択できます。クライアント(ラップトップで実行します)は、Linux、MacOS、Solaris、またはMicrosoft Windowsで実行できます。後者の場合、フローティングウィンドウを選択すると、それらはWindowsタスクバーに個別に表示されます。

Windows XPノートパソコン(Windows固有の特定のハードウェアに必要))をNX Nomachineを使用する2台のLinuxサーバーのフロントエンドとして使用しています。接続されているプリンターに印刷することもできますLinuxからの私のWindowsラップトップ。

2

Tmuxは、長時間実行プロセスをバックグラウンドで実行するために利用できる優れたオプションです。

GoogleクラウドプラットフォームのVMインスタンス/サーバー(OS:Ubuntu 16.0)で長時間実行プロセスを実行し続ける必要があります。SSHターミナルを開始する必要がある場所とターミナルから、端末を接続してプロセスを実行するために接続します。これで問題ありません。ただし、SSH端末との接続が終了すると、長時間実行されているプロセスがすぐに停止するため、もう一度実行する必要があります。 ssh端末が再起動されるか、新しいssh端末から再起動されます。

tmuxは、ターミナルを閉じた後でも実行したいプロセスの終了を回避するための良い解決策だと思います。

Terminal Multiplexertmuxtmuxセッションを開始するには:

  1. Sshターミナルを起動します。
  2. tmuxと入力します。同じターミナルでウィンドウを開きます。
  3. コマンドを実行して、tmuxセッションで実行時間の長いプロセスを開始します。

これで、SSHターミナルが突然閉じられた/終了した場合でも、tmuxセッションは、インスタンス/サーバーで起動された実行中のプロセスを実行し続けます。

接続が終了した場合、tmuxセッションで実行中のプロセスをバックグラウンドで確認するために再接続する方法:

  1. 再接続するか、新しいsshターミナルを開きます。このプロセス(バックグラウンドで実行され続ける)を表示するには、tmux attachコマンドを入力します。

Tmuxセッションを終了したい:

  1. プロセスを停止します。次に、tmux-terminal-windowにexitと入力します。

(注:tmux detachコマンドを使用する場合:tmuxセッションを終了/停止せずにtmuxセッションウィンドウ/ターミナルから終了します)

詳細については、次の記事を参照してください。

  1. https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
  2. https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/
1
Yogesh