web-dev-qa-db-ja.com

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

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

636
Olivier Lalonde

tmuxのような最新の選択肢を探す必要があります。

tmuxscreenよりも優れていますが、多くの理由があります。以下に例を示します。

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

基本機能

answerscreenの推奨で説明したのと同じ機能を使用するには、次のことを行う必要があります。

  • リモートマシンへのssh
  • tmuxをシェルに入力して、tmuxを開始します
  • 開始されたtmuxセッション内で必要なプロセスを開始します
  • 次を入力して、tmuxセッションを脱退します。 Ctrl+b その後 d

リモートマシンから安全にログオフできるようになり、プロセスはtmux内で実行され続けます。再び戻ってプロセスのステータスを確認したい場合は、tmux attachを使用してtmuxセッションにアタッチできます。

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

tmuxは、単一のセッションで単一のウィンドウを処理するよりもはるかに高度なことを実行できます。詳細については、man tmuxまたは tmux GitHubページ をご覧ください。特に、 FAQscreentmuxの主な違いについて。

737
tongpu

オプション1:Nohup

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

Nohup long-running-command &

このために特別に作成され、stdoutをNohup.logに記録します。

man Nohup

オプション2:bg

既に実行中のタスクを「バックグラウンド」にしたい場合、最善の策は Ctrl+Z その後、実行します

bg

最後に中断されたタスクをバックグラウンドにして、実行を継続できるようにします。

その後、ログアウトした後、disownで簡単にプロセスを実行できます。

screenと他の人がそれを行うことができますが、それは彼らが何をしているのかではありません。後に残す予定のタスクにはNohupを、既に実行中のタスクを再開するにはbgをお勧めします。

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

300
coteyr

screenを使用してそれを行うことができます。

man screenと入力して詳細を確認するか、こちらをお読みください screen man page

簡単なシナリオ:

  • リモートボックスにsshします。 screenと入力してから、必要なプロセスを開始します。

  • 押す Ctrl-A それから Ctrl-D。これにより、スクリーンセッションが「切り離され」ますが、プロセスは実行されたままになります。これで、リモートボックスからログアウトできます。

  • 後で戻ってきたい場合は、再度ログオンしてscreen -rと入力してください。これにより、スクリーンセッションが「再開」され、プロセスの出力を確認できます。

203
Lincoln

Screen and Nohupはより良い方法ですが、screenまたはNohupなしですでに実行されているプロセスを切り離す必要がある場合は、disownコマンドを実行できます。

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

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

Disownを使用すると、ターミナルを閉じてマシンでプロセスを実行できます。

83
bassgey

私は大きなmvで立ち往生していたので、プロセスを停止してセットアップ画面を表示し、それを再び開始することができませんでした。基本的に次の手順を実行して、実行中のプロセスでsshセッションを終了することができました。

  1. ssh [サーバー]
  2. コマンド
  3. Ctrl+Z
  4. bg
  5. disown [process pidオプション、デフォルトはlast]
  6. 出口

手順3は、現在のプロセスを一時停止します(例:「mv」コマンド)。
ステップ4は、一時停止したプロセスをバックグラウンドに入れて再開します。
ステップ5では、プロセスを否認できます。** ジョブのリストを取得するには、単にjobsbeforeと入力します。


** 否認について(bashマニュアルより):

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.
52
Chaos

複数のssh接続でプログラムと端末の状態を維持するために使用できる2つの主要なプログラムがあります。それらはスクリーン(現職だが、残念ながらメンテナンスされていない。どうやら 現在アクティブに開発されている )とtmux(新しい、アクティブにメンテナンスされている)である。 Byobuは、これらのシステムの上で実行でき、追加のUbuntuステータス情報を提供できるフロントエンドです。新しいインストールでは、tmuxをバックエンドとして使用します。byobuの古いインストールと既存の構成がある場合は、画面またはtmuxの前のバックエンドを維持します。

By風

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

Sudo aptitude install byobu

Yumを使用すると、

su -c 'yum install byobu'

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

びょうぶを使う

Sshを使用して接続した後、ホストマシンでbyobuを実行することにより、byobuを開始できます。これにより、次のようなシェルが作成されます。

image-byobu

また、-Xオプションを使用してUbuntuマシンでByobu Terminalを使用すると、完全に機能するbyobuを簡単に使用できます。

使用法:

byobuと入力して、byobuを開始します。

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

Byobuの最良の部分は、ターミナルを離れるためにターミナルで実行中のプロセスを実際に強制終了する必要がないことです。 screen/tmux(byobuのスケルトン)をバックグラウンドに送信して、次回来たときに再開できます。

  • O風を残して実行し続ける(切り離す)には、F6を押します。
  • 次回来るときは、byobuを実行するだけで、今いる場所に戻ることができます。

    byobu-detach-attach

byobu -S session1などにより、さまざまなビオブセッションを作成することもできます。また、戻ってきたときにそれらのいずれかに接続できます。

Byobuを使用すると、さらに多くのことができます。これを使って!一部の決定的なガイドは、 here または here です。

21
SiddharthaRT

プロセスが開始すると、これを行うことはできません。長時間実行するジョブを実行する前に、設定を行う必要があります。

Nohup を使用できますが、最新の知識では、ログインとしてscreenまたはbyobuを使用することをお勧めします。

Screenには、1つのマシンからデタッチし、別のマシンから再アタッチできるという利点があります。これは、1日の終わりを超えて実行される長時間実行プロセスを確認する場合に便利です。

合理的な開始方法があります 画面のガイド こちら。

byob は、メニューなどを備えた画面の上部に使いやすいインターフェイスを配置します。また、新しいUbuntuでの画面の現在の実装でもあります。 F2を押して新しいターミナルF3/F4を開始し、前後に切り替えてF6を押して切断します。実際に端末を完全に終了するには、exitと入力します。

18

長時間実行している単一のシェルスクリプトの場合、ログインし、「&」を使用してバックグラウンドでプロセスを実行します。

例:

/path/to/my/script &

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

8
user108430

ねえ、私はスクリーンが最も効果的なオプションであることに同意しました。 vncserverを使用して、その上でプロセスを開始できます。

また、プロセスを実行し、それを制御する必要がないだけで、セッションを閉じる必要があり、プロセスが既に実行されていることに気づいていないことが最も重要である場合も、運が悪い場合シェルとしてbashを使用しました

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

最後にdisownコマンドを実行します(その後にjobidが続きます... bgコマンドと同じ)

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

8
Jorge Gutierrez

GNU Screen をチェックして、役立つかどうか確認してください。アプリケーションをリアルタイムで実行する方法に応じて、解決するよりも多くの問題が発生する可能性がありますが、少なくともセッションを離れることなくセッションを再開できます。

使い方 :

  • 最初の起動にコマンド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を使用してそのセッションを再開できます。一度に複数の分離されたスクリーンセッションを持つことができます。この場合、利用可能なセッションのリストが表示されます。

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

4
T. Verron

最も簡単な答え...

ctrl + zは実行中のプログラムを中断します

「bg」はバックグラウンドで実行します

3
Roop

最も簡単な方法は、&を使用してバックグラウンドでコマンドを実行することです。それからちょうど書きなさい:

disown -a
3
Zibri

残念ながら、SSHセッションを終了すると、tmuxまたは画面が強制終了されます。これは、systemdがセッションからログアウトすると子プロセスを終了するためです。

logind.conf/etc/systemd/logind.conf)でこの設定を変更できます。

KillUserProcesses=no

https://unix.stackexchange.com/questions/490267 でお答えいただきありがとうございます。

0
Jonathan

誰もがdisown(プロセスを既に開始した後の唯一のオプション)、Nohup、またはscreenでコマンドを実行するように言っていますが、これは見たい場合に便利ですコマンドからのすべての出力...私はscreen。のファンです。私はまだ最新のLinuxの主流ディストリビューションを試しましたが、単にジョブをバックグラウンドに置いて終了しても、すべてのプロセスが発生するわけではありません死ぬまで走ります。グローバル設定などが必要です。かなり古いシステム(Slackware 12)でこれを試していますが、テストスクリプトを手動で強制終了するまで実行し続けます。

Shell$ cat > test.pl

#!/usr/bin/Perl
while(1){
     sleep(1);
}
    Shell$ Perl ./test.pl &
    Shell$ exit
    logout
    Shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 Perl ./test.pl
    Shell$ 

私のスクリプトがログファイルなどに書き込みを行ったとしても、screenがこれを実行する最良の方法であることに同意します。それ以外の場合、disown -aまたはNohupを使用する必要はありません。完全な妄想から抜け出しました。誰かがデフォルトでbashがどのように動作するかについていくつかの光を当てることができますか?システム管理者の中には、ユーザーのプロセスがシステムに負荷をかけすぎないように、大きなシェルのデフォルトを変更する人がいるかもしれません。

0
Dan Gullage