Sshセッションから多数のプロセスを起動するとします。これらのプロセスをリモートマシンで実行したまま、sshセッションを終了することは可能ですか?
tmux
のような最新の選択肢を探す必要があります。
tmux
はscreen
よりも優れていますが、多くの理由があります。以下に例を示します。
answerscreen
の推奨で説明したのと同じ機能を使用するには、次のことを行う必要があります。
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ページ をご覧ください。特に、 FAQscreen
とtmux
の主な違いについて。
Nohup
多くの場合、最良の方法が最も簡単です。
Nohup long-running-command &
このために特別に作成され、stdoutをNohup.log
に記録します。
man Nohup
bg
既に実行中のタスクを「バックグラウンド」にしたい場合、最善の策は Ctrl+Z その後、実行します
bg
最後に中断されたタスクをバックグラウンドにして、実行を継続できるようにします。
その後、ログアウトした後、disown
で簡単にプロセスを実行できます。
screen
と他の人がそれを行うことができますが、それは彼らが何をしているのかではありません。後に残す予定のタスクにはNohup
を、既に実行中のタスクを再開するにはbg
をお勧めします。
両方ともbash固有であることに留意してください。 bashを使用していない場合、コマンドは異なる可能性があります。
screen
を使用してそれを行うことができます。
man screen
と入力して詳細を確認するか、こちらをお読みください screen man page 。
簡単なシナリオ:
リモートボックスにsshします。 screen
と入力してから、必要なプロセスを開始します。
押す Ctrl-A それから Ctrl-D。これにより、スクリーンセッションが「切り離され」ますが、プロセスは実行されたままになります。これで、リモートボックスからログアウトできます。
後で戻ってきたい場合は、再度ログオンしてscreen -r
と入力してください。これにより、スクリーンセッションが「再開」され、プロセスの出力を確認できます。
Screen and Nohupはより良い方法ですが、screenまたはNohupなしですでに実行されているプロセスを切り離す必要がある場合は、disownコマンドを実行できます。
disown [-ar] [-h] [
jobspec
… |
pid
… ]
オプションなしで、アクティブなジョブのテーブルから各jobspecを削除します。
-h
オプションが指定されている場合、ジョブはテーブルから削除されませんが、シェルがSIGHUPを受信した場合にSIGHUPがジョブに送信されないようにマークされます。 jobspecが存在せず、-a
オプションも-r
オプションも指定されていない場合、現在のジョブが使用されます。 jobspecが指定されていない場合、-a
オプションはすべてのジョブを削除またはマークすることを意味します。 jobspec引数なしの-r
オプションは、操作を実行中のジョブに制限します。
Disownを使用すると、ターミナルを閉じてマシンでプロセスを実行できます。
私は大きなmvで立ち往生していたので、プロセスを停止してセットアップ画面を表示し、それを再び開始することができませんでした。基本的に次の手順を実行して、実行中のプロセスでsshセッションを終了することができました。
手順3は、現在のプロセスを一時停止します(例:「mv」コマンド)。
ステップ4は、一時停止したプロセスをバックグラウンドに入れて再開します。
ステップ5では、プロセスを否認できます。** ジョブのリストを取得するには、単にjobs
beforeと入力します。
** 否認について(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.
複数のssh接続でプログラムと端末の状態を維持するために使用できる2つの主要なプログラムがあります。それらはスクリーン(現職だが、残念ながらメンテナンスされていない。どうやら 現在アクティブに開発されている )とtmux(新しい、アクティブにメンテナンスされている)である。 Byobuは、これらのシステムの上で実行でき、追加のUbuntuステータス情報を提供できるフロントエンドです。新しいインストールでは、tmuxをバックエンドとして使用します。byobuの古いインストールと既存の構成がある場合は、画面またはtmuxの前のバックエンドを維持します。
Byobuは、Debianベースのマシンでインストールすることでコンピューターにインストールできます。
Sudo aptitude install byobu
Yumを使用すると、
su -c 'yum install byobu'
他のディストリビューションにbyobuをインストールすることもできます。
Sshを使用して接続した後、ホストマシンでbyobu
を実行することにより、byobuを開始できます。これにより、次のようなシェルが作成されます。
また、-Xオプションを使用してUbuntuマシンでByobu Terminalを使用すると、完全に機能するbyobuを簡単に使用できます。
byobu
と入力して、byobuを開始します。
F2を押して現在のセッション内に新しいウィンドウを作成し、F3-F4を押してさまざまなウィンドウを切り替えることができます。
Byobuの最良の部分は、ターミナルを離れるためにターミナルで実行中のプロセスを実際に強制終了する必要がないことです。 screen/tmux(byobuのスケルトン)をバックグラウンドに送信して、次回来たときに再開できます。
次回来るときは、byobu
を実行するだけで、今いる場所に戻ることができます。
byobu -S session1
などにより、さまざまなビオブセッションを作成することもできます。また、戻ってきたときにそれらのいずれかに接続できます。
Byobuを使用すると、さらに多くのことができます。これを使って!一部の決定的なガイドは、 here または here です。
プロセスが開始すると、これを行うことはできません。長時間実行するジョブを実行する前に、設定を行う必要があります。
Nohup を使用できますが、最新の知識では、ログインとしてscreenまたはbyobuを使用することをお勧めします。
Screenには、1つのマシンからデタッチし、別のマシンから再アタッチできるという利点があります。これは、1日の終わりを超えて実行される長時間実行プロセスを確認する場合に便利です。
合理的な開始方法があります 画面のガイド こちら。
byob は、メニューなどを備えた画面の上部に使いやすいインターフェイスを配置します。また、新しいUbuntuでの画面の現在の実装でもあります。 F2を押して新しいターミナルF3/F4を開始し、前後に切り替えてF6を押して切断します。実際に端末を完全に終了するには、exitと入力します。
長時間実行している単一のシェルスクリプトの場合、ログインし、「&」を使用してバックグラウンドでプロセスを実行します。
例:
/path/to/my/script &
ログアウトし、SSHセッションを切断しました。しばらくしてからログインしても、スクリプトからの継続的なデータ収集で証明されているように、スクリプトはまだ実行されています。
ねえ、私はスクリーンが最も効果的なオプションであることに同意しました。 vncserverを使用して、その上でプロセスを開始できます。
また、プロセスを実行し、それを制御する必要がないだけで、セッションを閉じる必要があり、プロセスが既に実行されていることに気づいていないことが最も重要である場合も、運が悪い場合シェルとしてbashを使用しました
まず、Ctrl + Zに続けてbg%1を入力して、プロセスをバックグラウンドに送信する必要があります(番号はジョブ番号によって異なりますが、通常は1ですが、コマンドジョブを使用して簡単にリストをプルできます)。
最後にdisownコマンドを実行します(その後にjobidが続きます... bgコマンドと同じ)
これにより、バックグラウンドでシェルとプロセスの間の親子関係が削除され、シェルが終了したときに死ぬことを防ぎます。
GNU Screen をチェックして、役立つかどうか確認してください。アプリケーションをリアルタイムで実行する方法に応じて、解決するよりも多くの問題が発生する可能性がありますが、少なくともセッションを離れることなくセッションを再開できます。
使い方 :
screen
を使用し、紹介メッセージをスクロールすると、端末が表示されます。screen -r
を使用してそのセッションを再開できます。一度に複数の分離されたスクリーンセッションを持つことができます。この場合、利用可能なセッションのリストが表示されます。分割画面など、他の多くのオプションがあり、すべてのショートカットは完全にカスタマイズ可能です。
最も簡単な答え...
ctrl + zは実行中のプログラムを中断します
「bg」はバックグラウンドで実行します
最も簡単な方法は、&
を使用してバックグラウンドでコマンドを実行することです。それからちょうど書きなさい:
disown -a
残念ながら、SSHセッションを終了すると、tmuxまたは画面が強制終了されます。これは、systemd
がセッションからログアウトすると子プロセスを終了するためです。
logind.conf
(/etc/systemd/logind.conf
)でこの設定を変更できます。
KillUserProcesses=no
https://unix.stackexchange.com/questions/490267 でお答えいただきありがとうございます。
誰もが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がどのように動作するかについていくつかの光を当てることができますか?システム管理者の中には、ユーザーのプロセスがシステムに負荷をかけすぎないように、大きなシェルのデフォルトを変更する人がいるかもしれません。