Sshセッションを終了した後にプロセスを実行し続けるには?

Sshセッションからたくさんのプロセスを起動したとしましょう。 これらのプロセスをリモートマシン上で実行したままsshセッションを終了することは可能ですか?

あなたは次のような現代的な選択肢を探すべきです tmux.

tmux より優れています screen 多くの理由から、ここではいくつかの例を示します:

  • Windowsはセッション間で移動したり、複数のセッションにリンクしたりすることもできます
  • ウィンドウは、水平方向と垂直方向にペインに分割することができます
  • UTF-8および256カラー端末のサポート
  • セッションを入力することなく、シェルからセッションを制御できます

基本機能

で説明したのと同じ機能を取得するには、次のようにします。 ともかく お勧めの screen、次の操作を行う必要があります:

  • リモートマシンへのssh
  • スタート tmux と入力することで、 tmux シェルに
  • 開始された内部で必要なプロセスを開始します tmux セッション
  • を残す/デタッチする tmux 入力によるセッション Ctrl+b そして d

リモートマシンから安全にログオフできるようになり、プロセスは内部で実行され続けます tmux. あなたが再び戻ってきて、あなたのプロセスの状態を確認したいときは、使用することができます tmux attach あなたのに付すため tmux セッション。

複数のセッションを並べて実行する場合は、次のように各セッションに名前を付ける必要があります Ctrl+b$. 現在実行中のセッションのリストを取得するには、次の方法を使用します tmux list-sessions、コマンドで実行中のセッションにアタッチします tmux attach-session -t <session-name>.

tmux 単一のセッションで単一のウィンドウを処理するよりもはるかに高度なことを行うことができます。 より多くの情報のために一見を持って下さい man tmux または tmux GitHubページ. 特に, よくある質問は次のとおりです の主な違いについて screentmux.

オプション1: nohup

最良の方法は、多くの場合、最も簡単です。

nohup long-running-command &

それはこれのために特別に作られました、それはstdoutをログに記録します nohup.log.

man nohup

オプション2: bg + disown

ctrl+zbgdisown -h

すでにタスクを実行している"背景"にしたい場合は、 Ctrl+Z 次に実行します bg それが実行を継続できるように、バックグラウンドにあなたの最新の中断されたタスクを配置します。 disown あなたがログアウトした後、プロセスが実行され続けます。 その -h フラグはハングアップを防止します。


screen そして、他の人がそれを行うことができますが、それは彼らが何のためにしているのではありません。 私はお勧めします nohup あなたが知っているタスクのために、あなたは後ろに残そうとしていると bg タスクの場合は、すでに実行しており、再起動したくありません。

覚えておいてください、両方ともbash固有のものです。 Bashを使用していない場合は、コマンドが異なる可能性があります。

あなたはそれを使うことによってそれをすることができます screen.

タイプ man screen 続きを読むか、これを読むには screen manページ.

シンプルなシナリオ:

  • リモートボックスにssh接続します。 タイプ screen 次に、必要なプロセスを開始します。

  • プレス Ctrl-A その後 Ctrl-D. これにより、画面セッションは"デタッチ"されますが、プロセスは実行されたままになります。 これで、リモートボックスからログアウトできます。

  • 後で戻ってきたい場合は、もう一度ログオンして次のように入力します screen -r これにより、画面セッションが「再開」され、プロセスの出力が表示されます。

Screenとnohupがより良い方法ですが、screenまたはnohupなしで既に実行されているプロセスをデタッチする必要がある場合は、disownコマンドを実行できます。

disown [-ar] [-h] [jobspec… |pid… ]

オプションを指定せずに、それぞれを削除します ジョブスペック アクティブジョブのテーブルから。 の場合は、 -h オプションが指定されている場合、ジョブはテーブルから削除されませんが、シェルがSIGHUPを受信した場合にSIGHUPがジョブに送信されないようにマークされます。 もし ジョブスペック 存在しない、とどちらも -a また、 -r オプションが指定されると、現在のジョブが使用されます。 ない場合 ジョブスペック が供給され、 -a オプションは、すべてのジョブを削除またはマークすることを意味します。 -r オプションなし ジョブスペック 引数は、実行中のジョブに操作を制限します。

Disownを使用すると、端末を閉じて、マシン上でプロセスを実行することができます。

私は大きなmvで立ち往生していたので、プロセス、セットアップ画面を停止してから再度起動する立場にはありませんでした。 基本的に次の手順を実行して、プロセスを実行してSSHセッションを終了することができました:

  1. SSH接続の確立: ssh user@host
  2. 目的のコマンドを実行してプロセスを開始します
  3. プレス Ctrl+Z プロセスを一時停止するには
  4. 走れ。 bg 一時停止したプロセスをバックグラウンドに入れて再開します。
  5. 走れ。 disown [pid] (プロセスIDはオプションで、デフォルトは最後のプロセスです)プロセスを否認します。 ジョブのリストを取得するには、次のように入力します jobs 前に。
  6. SSHセッションを終了するには、次のコマンドを実行します logout.

の使用法 disown コマンド:

disown [-ar] [-h] [jobspec ... | pid ... ]              Without  options,  remove  each jobspec from the table of active              jobs.  If jobspec is not present, and neither the -a nor the  -r              option  is  supplied, the current job is used.  If the -h option              is given, each jobspec is not removed from  the  table,  but  is              marked  so  that  SIGHUP  is  not  sent  to the job if the shell              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option              means  to  remove or mark all jobs; the -r option without a job‐              spec argument restricts operation to running jobs.   The  return              value is 0 unless a jobspec does not specify a valid job.

複数のssh接続を介してプログラムと端末の状態を維持するために使用できる2つの主要なプログラムがあります。 彼らは画面です(現職ですが、残念ながら維持されていません。 どうやら 現在、積極的に開発されています)とtmux(より新しい、積極的に維持)。 Byobuは、これらのシステムの上で実行し、追加のubuntuのステータス情報を提供することができますフロントエンドです。 新しいインストールでは、バックエンドとしてtmuxを使用します。byobuの古いインストールと既存の設定があれば、以前のバックエンドを維持します。screenまたはtmux

屏風

Byobuは、Debianベースのマシンでそうすることで、コンピュータにインストールすることができます:

sudo aptitude install byobu

Yumを使用すると、次のようになります

su -c 'yum install byobu'

他のディストリビューションにbyobuをインストールすることも可能です。

屏風を使う

Byobuを起動するには、次のコマンドを実行します byobu sshを使用して接続した後、ホストマシン上で。これはあなたに次のようなシェルを与えるでしょう:

image-byobu

また、-Xオプションを使用してUbuntuマシンでByobuターミナルを使用することもでき、簡単に完全に動作するbyobuを持つことができます。

使用法:

と入力して屏風を起動します。 byobu.

F2キーを押すと、現在のセッション内に新しいウィンドウが作成され、f3-F4キーを押すと、さまざまなウィンドウを切り替えることができます。

Byobuについての最良の部分は、端末を離れるために端末で実行されているプロセスを実際に強制終了する必要がないことです。 あなたは、単に背景にscreen/tmux(屏風の骨格)を送信し、あなたが来て、次の時間を再開することができます:

  • 屏風を残してkeeepするには、F6を押します。

  • あなたが次に来るときは、ちょうどやってください byobu そして、あなたはあなたがいた場所に戻ってくるsholud。

    byobu-detach-attach

また、さまざまな屏風セッションを作成することもできます byobu -S session1 というように。 そして、あなたが戻ってくるとき、あなたはそれらのいずれかに接続することができます。

あなたは屏風を使用してはるかに多くを行うことができます。 それを使用してください!いくつかの決定的なガイドは次のとおりです ここでは、、または ここでは、.

長時間実行されるジョブを実行する前に設定する必要があります。

あなたが使用することができます ノウップ しかし、現代の知恵では、ログインとしてscreenまたはbyobuを使用することを示唆しているので、物事を切り離して実行したままにすることができます。

Screenには、あるマシンからデタッチして別のマシンから再接続できるという利点があり、作業日の終わりを超えて実行される長時間実行されるプロセ

合理的な入門があります 画面へのガイド ここだ

屏風 メニューなどで画面の上に使いやすいインターフェイスを置きます。 また、新しいubuntuでのscreenの現在の実装でもあります。 新しい端末を起動するにはf2F3/f4を前後に切り替え、切断するにはF6を切り替えます。 実際に端末を永久に終了するには、exitと入力します。

私が長い期間にわたって実行している単一のシェルスクリプトの場合、私はログインし、'&'を使用してバックグラウンドでプロセスを実行します。

例:

/path/to/my/script &

私はログアウトし、私のSSHセッションを切断しました。 後でログインすると、スクリプトからの継続的なデータ収集によって証明されたように、スクリプトはまだ実行されています。

こんにちはが合意した画面は最もefectiveオプションです。Vncserverを使用して、そのプロセスを開始できます。

また、あなたの唯一のinteresがプロセスを実行し、それを制御する必要がないことであり、セッションを閉じる必要があり、プロセスがすでに実行されてい

まず、Ctrl+Zの後にbg%1と入力してプロセスをバックグラウンドに送信する必要があります(数はジョブ番号に依存しますが、通常は1ですが、コマンドjobsを使用して簡単にリストをプルできます)

最後に、disownコマンドを呼び出します(その後にjobidが続きます。.. bgコマンドと同じ)

これにより、シェルとバックグラウンドのプロセスとの親子関係が削除され、シェルが終了したときにプロセスが死ぬのを防ぎます。

あなたはチェックアウトする必要があります GNUスクリーン それがあなたを助けるかどうかを確認します。 アプリケーションをリアルタイムで実行する必要がある方法に応じて、解決するよりも多くの問題が発生する可能性がありますが、少なくともセッシ

使用する方法 :

  • 次のコマンドを使用します screen 最初のスタートのために、紹介メッセージをスクロールするには、端末を渡される必要があります。
  • C-a C-cは別の端末を開きます
  • C-a C-kは端末を殺す
  • C-a C-SpaceおよびC-a C-Backspaceを使用して、端末を循環させることができます
  • C-a c-aは、主に2つの端末のみを使用している場合に便利です
  • C-a c-d現在の画面セッションを分離し、画面を終了する。 その後、次のように使用できます screen -r そのセッションを再開する。 この場合、使用可能なセッションのリストが表示されます。

そこに他の多くのオプションは、例えば、分割画面があり、また、すべてのショートカットは完全にカスタマイズ可能です。

関連:How can I run a command which will survive terminal close? - Unix & Linux Stack Exchange