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


回答:


750

のような現代的な代替品を探す必要がありますtmux

tmuxscreen多くの理由で優れていますが、ここにいくつかの例を示します:

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

基本機能

推奨の回答で説明されている機能と同じ機能を取得screenするには、次のことを行う必要があります。

  • リモートマシンにSSH接続します
  • シェルにtmux入力tmuxすることから始めます
  • 開始したtmuxセッション内で必要なプロセスを開始します
  • + をtmux入力してセッションを脱退するCtrlbd

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

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

tmux単一のセッションで単一のウィンドウを処理するよりもはるかに高度なことができます。詳細については、中を見ていman tmuxたりtmuxはGitHubのページを。特に、との主な違いに関するFAQscreenありtmuxます。


4
@CraigM アクティブなスクリーンセッションが1つしかない場合は、screen -x -r [screenname]または略して使用screen -rxします。これにより、既存の画面インスタンスを添付できます。
-Lekensteyn

5
このアドバイスは同じ問題を解決するのに役立ちましたが、タイプミスが含まれていると思います。私は、あなたが入力する必要があることを確信しているCtrl-bし、その後dデタッチ/残すためにtmuxセッションを。確かに、これはtmux私のUbuntu 12.04のバージョンの場合です。
cxrodgers

17
上記の指示に従っている間にミスをしました。誰かが同じ間違いに陥る可能性がある場合は、共有します。リモートコンピューターのシェルではなく、自分のコンピューターのシェルでtmuxを起動しました。リモートコンピューターのシェルでtmuxを起動する必要があります。
メルトヌホグル

5
スクリーンは再び開発中です。lists.gnu.org / archive / html / screen-devel / 2014-04 / msg00024.html回答を更新してください。
ムル14年

4
または、tmux detach入力する代わりに実行しますctrl-b d
アンドリュー

305

オプション1: nohup

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

nohup long-running-command &

このために特別に作成されたもので、stdoutにログを記録しnohup.logます。

man nohup

オプション2: bg

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

bg

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

その後、disownログアウト後にプロセスを実行し続ける必要があります。

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

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


4
私が行うことをお勧めしますdisown -h
ミケーレ

興味深いことに、スクリーンとtmuxはマイナーでは機能しません
。burnohupは

1
bg+ disownがうまくいきませんでした。tmux内で開始するのを忘れていた展開スクリプトを実行していたため、会議のために早退する必要がありました。スクリプトは、進行状況をシェルに継続的に出力します。ctrl+zプロセスを停止し、bashに戻りました。bgプロセスを再開しましたが、ステータスのbashへの出力も再開したため、入力した内容を確認できなくなりました。ただし、disownコマンドは「disown:current:no
such

julia myFile.jlなんらかの理由でこれはうまくいきませんでした。tmuxは、すばらしい機能です。
kilgoretrout

これは私のために働いた、本当にありがとう
チャド

207

あなたはそれを使用してそれを行うことができますscreen

入力man screenして詳細を確認するか、この画面のマニュアルページを読んでください

簡単なシナリオ:

  • リモートボックスにsshします。入力screen後、あなたがしたいプロセスを開始します。

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

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


32
通常は、screen -S name後で正しいセッションに簡単に接続できるように、スクリーンセッションに名前を付けます。
デビッドオニール

リンクがダウンしている
好人甲是

1
個人的に、私はパッケージ制御ソフトウェアのない箱に取り組んでいます。ソースからTMUXの依存関係を構築するのに30分ほど費やした後(私は個人的に経験し、気に入っています)、画面が私にとってより良い、よりシンプルなソリューションであることが明らかになりました。TL; DR:この問題の最適な解決策は、ユースケース、マシン、およびセットアップに要する時間に依存します。この答えをありがとう:)
マックスフォンヒッペル

screen -S休暇前とscreen -r帰国時の組み合わせは素晴らしいです!
メロマン

これをありがとう。このソリューションは私にとってはうまくいきましたが、tmuxはうまくいきませんでした(LinuxマシンにsshするときにWindowsにbashのバージョンを使用します)
Michael Sorensen

83

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

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

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

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


10
これも私のお気に入りの方法です。私は頻繁に使用するdisown -a && exit
ステファノ・パラッツォ

1
パーフェクト。これは素敵なコマンドであり、すべての賛成に値します!
グレッグ14

8
注意の一言として、Ctrl-Zで実行中のプロセスを停止し、呼び出しの前にバックグラウンドで開始しなかったため、強制終了しましたdisown
HDave 14

3
端末に書き込みたい場合にクラッシュする可能性があります。実行中のプロセスの出力をリダイレクトするのは簡単ではありません。nohupを使用して適切に起動することをお勧めします。
ジグガンジャー

2
質問に直接答えるので、これは良い答えです。質問の作成者は、長時間実行するコマンドを既に実行した後に何をすべきかを尋ねました。これらの回答のほとんどは、コマンドを実行する前に何をすべきかを教えてくれます。
q0rban

53

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

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

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


**否認について(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.

2
ビルトインは常に私の最初の選択です:) THX
ken_oy

この答えは正しいとマークされるべきです。インストールして、この問題を解決するためのスクリーニングに慣れることは誇張されています。
ウルリッヒ・ローレンツ・シュ

これは、すでにコマンドを開始していて、長時間実行されている場合に非常に役立ちます。終了とTMUXセッションでそれを起動するには時間がかかります
Deepaliミタル

1
@ tom-brossman:このような不必要な編集に注意してください!ジョブ指定なしで呼び出された場合、disown組み込みコマンドは最新のバックグラウンドジョブで動作します。
デビッドフォースター

22

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

By風

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

sudo aptitude install byobu

yumを使用して、あなたは

su -c 'yum install byobu'

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

びょうぶを使う

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

画像b

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

使用法:

と入力してbyobuを起動しますbyobu

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

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

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

    バイブデタッチアタッチ

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

Byobuを使用すると、さらに多くのことができます。これを使って!いくつかの決定的なガイドがここにあります


UbuntuボックスへのPuTTYベースのセッションからbyobuを使用しようとしましたが、ステータス行が繰り返され、ディスプレイ上でスクロールします。F6キーを押すと適切に切り離されましたが、私のセットアップでは使用可能なソリューションではありませんでした。
-jfmessier

1
@jfmessierこれは、PuTTYがncurses(基本的にutf-8)をうまくとらないためです。このスレッドに従うことにより、この問題を解消することが可能です-stackoverflow.com/questions/10731099/…–
SiddharthaRT

これはすごい!1.それは私が私のデフォルトのシェルと私は同時に2つのボットを実行するために取得し、2通りのbashを有効にするために見えることはできません色のbashプロンプト与え、まだ上で作業を行うための別の端末を持っています!@SiddharthaRTあなたは賛成に値する!
開発

18

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

nohupは使用できますが、ログインとしてscreenまたはbyobuを使用することをお勧めします。これにより、接続を解除して実行したままにすることができます。

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

ここには、適切な入門ガイドがあります

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


byobuは最近tmuxを使用しています
。– scottl

12
「プロセスの開始後にこれを行うことはできません。長時間実行するジョブを実行する前に設定を行う必要があります。」-いいえ、disownこれを実現するために使用できます。bassgeyの答え@を参照してください
リッチ

1
画面とtmuxのを学ぶのに苦労した後....屏風は、私の目に涙をもたらした
HDave

disownただ、必要な場合とCtrl-z、その後、bgそのアクティブ端末のバックグラウンドを取得します。その後、disown
-mimoralea

8

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

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

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

最後にdisownコマンドを実行します(bidコマンドの場合と同じjobidが続きます)。

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


2
この答えは最高です!なぜみんなが話してscreenいるのかという質問は、ログイン後、プロセスを開始する前に、ログイン後のイベント、プロセスの実行を維持する方法について提起されました。ホルヘの素晴らしい答え、あなたは本当に私を助けてくれました!:)
jwbensley

1
単純にbg(なしの%1デフォルトは現在の仕事であることから、多くの場合十分です)
ウォルターTross

包括的な答えがあると便利です。事前(事前設定):ascii端末画面(旧)、tmux(要注意)。Xウィンドウ:vnc(古い、まだ維持されている)、xpra(新しい)、xpraはルートレスです。後部(開始後も保持):^ Z、disown、...しかし、私はこれよりも肉付けするのが面倒です。
クレイジーグリュー

8

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

例:

/path/to/my/script &

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


3
はい、screen / tmuxがこの単純なソリューションよりも優れていることを知りたいです。
マッドスキャーン

はい、私のubuntuでもこれを見ることができますが、理論的には起こりません。理由がわかりません
ダニエルピニョル

1
@MadsSkjernこのメソッドを使用してスクリプトに入力を入力することはできないためです。
ケンシャープ

1
@MadsSkjern理由は、&ログアウトしてSSHセッションにログインしてこのようなプロセスを実行すると、プロセスは引き続き実行されますが、そのプロセスの出力を表示することはできません(スクリプトが何かをエコーし​​た場合表示されませんが、ファイルを書き込むとファイルはそこにあります)
-DarkCygnus

4

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

使い方 :

  • screen最初の起動にコマンドを使用し、紹介メッセージをスクロールすると、端末が渡されます。
  • Ca Ccは別のターミナルを開きます
  • Ca Ckは端末を殺します
  • Ca C-SpaceおよびCa C-Backspaceを使用して、ターミナルを循環できます。
  • Ca Caは、主に2つのターミナルのみを使用している場合に便利です。
  • Ca Cdは、現在の画面セッションを切り離し、画面を終了します。その後、を使用screen -rしてそのセッションを再開できます。一度に複数の分離されたスクリーンセッションを持つことができます。この場合、利用可能なセッションのリストが表示されます。

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


3

最も簡単な答え...

ctrl + zは実行中のプログラムを一時停止します

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


5
disownまたはのようなnohup)プロセスを否認せずに、これは通常、SSHセッションの終了後にプロセスを実行し続けません。
エリアケイガン

3
私のUbuntuサーバーでは、デフォルト設定で、本当に実行し続けます!
マッドスキャーン

3

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

disown -a

0

誰もが使用するように言っていますが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がどのように動作するかについていくつかの光を当てることができますか?システム管理者の中には、ユーザーのプロセスがシステムに過負荷をかけないように、大きなシェルのデフォルトを変更する人がいるかもしれません。


さらに質問がある場合は、新しい質問
-heemayl

0

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

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

KillUserProcesses=no

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


-1

の代わりに :

cmd options; 

前に追加nohup

nohup cmd options & 

次に、次の方法でコンソールの標準出力を表示できます。

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