ウェブサイト検索

切断後もリモート SSH セッションとプロセスを実行し続ける 5 つの方法


簡単に言えば、SSH または セキュア シェル は、コマンド ライン、つまり非 GUI モードでのみ、他のシステム上の別のユーザーにリモートでアクセスできる方法です。より技術的な用語で言えば、他のシステム上の他のユーザーに SSH 接続して、そのマシン上でコマンドを実行すると、実際には疑似端末が作成され、ログインしているユーザーのログイン シェルに接続されます。

セッションからログアウトするか、長時間アイドル状態が続いた後でセッションがタイムアウトすると、SIGHUP シグナルが疑似端末とその端末上で実行されているすべてのジョブに送信されます。擬似端末上で親ジョブが開始されているジョブにも SIGHUP シグナルが送信され、強制的に終了されます。

お見逃しなく: SSH サーバーを安全に保護するための 5 つの有益な実践方法

この信号を無視するように構成されたジョブのみが、セッション終了後も存続します。 Linux システムでは、ユーザーがログアウトしてセッションが終了した後でも、これらのジョブをリモート サーバーまたは任意のマシンで実行するためのさまざまな方法が用意されています。

Linux 上のプロセスを理解する

通常のプロセス

通常のプロセスは、セッションの存続期間を持つプロセスです。これらはセッション中にフォアグラウンド プロセスとして開始され、特定の期間が経過するか、セッションがログアウトされたときに終了します。これらのプロセスの所有者は、root を含むシステムの有効なユーザーのいずれかになります。

孤立したプロセス

孤立プロセスとは、最初はプロセスを作成した親プロセスがあったものの、しばらくすると親プロセスが意図せず終了するかクラッシュし、init がそのプロセスの親になるプロセスです。このようなプロセスには、直接の親として init があり、プロセスが終了するか終了するまで待機します。

デーモンプロセス

これらは意図的に孤立したプロセスであり、システム上で意図的に実行されたままになっているこのようなプロセスは、デーモンまたは意図的に孤立したプロセスと呼ばれます。これらは通常、長時間実行されるプロセスであり、一度開始されると制御端末から切り離されるため、完了しないか最終的にエラーがスローされるまでバックグラウンドで実行できます。このようなプロセスの親は意図的に停止し、子をバックグラウンドで実行させます。

切断後も SSH セッションを実行し続けるためのテクニック

以下に説明するように、切断後に ssh セッションを実行したままにするさまざまな方法があります。

1. screen コマンドを使用して SSH セッションを実行し続ける

screen は Linux 用のテキスト ウィンドウ マネージャーで、ユーザーは複数のターミナル セッションを同時に管理したり、セッション間の切り替え、画面上で実行中のセッションのセッション ログを記録したり、必要なときにいつでもセッションを再開したりすることができます。セッションがログアウトされたり、ターミナルが閉じられたりすることを心配する必要はありません。

screen セッションを開始し、制御端末から切断してバックグラウンドで実行したままにし、いつでもどこでも再開できます。画面上でセッションを開始し、必要に応じて疑似端末 (または制御端末) からセッションを切断してログアウトするだけです。と感じたら、再ログインしてセッションを再開できます。

スクリーンセッションの開始

「screen」 コマンドを入力すると、新しい screen セッションが開始され、このセッション内で新しいウィンドウの作成、ウィンドウ間の移動、画面のロックなど、さまざまな操作を行うことができます。通常の端末。

screen

screen セッションが開始されると、任意のコマンドを実行し、セッションを切断することでセッションの実行を継続できます。

スクリーンの取り外し

リモート セッションからログアウトしたいが、そのマシン上で作成したセッションを維持したい場合は、端末から画面を切り離して、制御端末が残らないようにするだけです。これを実行すると、安全にログアウトできます。

リモート端末から画面を切り離すには、「Ctrl+a 」 を押し、すぐに 「d 」 を押すだけで、端末に戻り、画面が切断されたというメッセージが表示されます。切り離されています。これで安全にログアウトでき、セッションはそのまま残ります。

分離された画面セッションの再開

ログアウトする前に終了した切り離された画面セッションを再開したい場合は、リモート端末に再度ログインし、“screen -r ” と入力します(画面が 1 つだけ開いている場合と、複数の画面が開いている場合)。 screen セッションは、「screen -r を実行して開きます。

screen -r
screen -r <pid.tty.host>

screen コマンドとその使用方法の詳細については、リンクに従ってください: screen コマンドを使用して Linux ターミナル セッションを管理する

2. Tmux (ターミナルマルチプレクサ) を使用して SSH セッションを実行し続ける

Tmux画面の代わりとして作成されたソフトウェアです。これはスクリーンの機能のほとんどを備えていますが、スクリーンよりも強力にする追加機能はほとんどありません。

画面によって提供されるすべてのオプションとは別に、複数のウィンドウ間でペインを水平または垂直に分割すること、ウィンドウ ペインのサイズ変更、セッション アクティビティの監視、コマンド ライン モードを使用したスクリプト作成などが可能になります。tmux のこれらの機能により、tmux はほぼすべての企業で広く採用されています。すべての Unix ディストリビューション、さらには OpenBSD の基本システムに含まれています。

Tmux セッションを開始する

リモート ホストで ssh を実行し、tmux と入力すると、新しいウィンドウが目の前に開いて新しいセッションに入り、通常の端末で行うことはすべて実行できます。

tmux

端末上で操作を実行した後、制御端末からそのセッションを切断すると、セッションがバックグラウンドになり、安全にログアウトできます。

ターミナルから Tmux セッションを切断する

実行中の tmux セッションで “tmux detach ” を実行するか、ショートカット (Ctrl+b の次に d) を使用できます。この後、現在のセッションが切断され、安全にログアウトできる端末に戻ります。

tmux detach

閉じられた Tmux セッションの再開

システムからログアウトしたときに切り離してそのまま残したセッションを再度開くには、リモート マシンに再ログインし、「tmuxattach」と入力して閉じたセッションに再接続します。これからもそこにいて、走り続けるでしょう。

tmux attach

tmux とその使用方法の詳細については、リンクに従ってください: Tmux ターミナル マルチプレクサを使用して複数の Linux ターミナルを管理する。

3. nohup コマンドを使用して SSH セッションを実行し続ける

screentmux にあまり慣れていない場合は、nohup を使用して、長時間実行されるコマンドをバックグラウンドに送信して、作業を続行できます。コマンドはバックグラウンドで実行され続けます。その後、安全にログアウトできます。

nohup コマンドを使用すると、終了時に ssh セッションによって送信されるSIGHUP シグナルを無視するようにプロセスに指示するため、セッションのログアウト後もコマンドが持続します。セッションのログアウト時に、コマンドは制御端末から切り離され、デーモン プロセスとしてバックグラウンドで実行され続けます。

バックグラウンドで nohup を使用してコマンドを実行する

これは、nohup を使用して ssh セッションのバックグラウンドでファイルを検索する find コマンドを実行した後、タスクがバックグラウンドに送信され、すぐにプロンプトが返され、PID とジョブ を示す簡単なシナリオです。 >プロセス ([JOBID] PID) の ID

nohup find / -type f $gt; files_in_system.out 2>1 &

セッションを再開してジョブがまだ実行中かどうかを確認する

再度ログインすると、コマンドのステータスを確認したり、'fg %JOBID' を使用してコマンドをフォアグラウンドに戻して進行状況を監視したりできます。以下の出力は、再ログイン時には表示されないジョブが完了したことを示し、表示される出力を示しています。

fg %JOBID

4. disown コマンドを使用して SSH セッションを実行し続ける

コマンドまたは単一のタスクをバックグラウンドで実行し、セッションのログアウトまたは切断後も存続させるもう 1 つのエレガントな方法は、否認 を使用することです。

Disown は、システムのプロセス ジョブ リストからジョブを削除します。そのため、セッション切断時にシェルによってSIGHUP を受信しないため、プロセスはセッション切断中に強制終了されないように保護されます。ログアウトします。

この方法の欠点は、特にリダイレクトしない限り、stdin からの入力が必要なく、stdout に書き込む必要もないジョブにのみ使用する必要があることです。ジョブの入出力。ジョブが標準入力または標準出力と対話しようとすると停止するためです。

バックグラウンドで disown を使用してコマンドを実行する

以下では、ut が実行を継続し、ジョブ リストから削除されるように、ping コマンドをバックグラウンドに送信しました。ご覧のとおり、ジョブは最初に一時停止されましたが、 その後もジョブ リストにプロセス ID: 15368 として残っています。

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

その後、否認シグナルがジョブに渡され、ジョブ リストから削除されましたが、バックグラウンドでまだ実行されていました。以下に示すように、リモート サーバーに再ログインしても、ジョブは引き続き実行されます。

ps -ef | grep ping

5.etsid コマンドを使用して SSH セッションを実行する

必要な動作を実現するためのもう 1 つのユーティリティはsetsid です。 Nohup には、プロセスのプロセス グループが同じままであるため、nohup で実行されているプロセスは、プロセス グループ全体に送信されるシグナル (Ctrl + C など) に対して脆弱であるという点で欠点があります。 )。

一方、setsid は実行中のプロセスに新しいプロセス グループを割り当てるため、作成されたプロセスは完全に新しく割り当てられたプロセス グループに属し、セッション ログアウト後でも強制終了される心配なく安全に実行できます。

setid を使用して任意のコマンドを実行する

ここでは、プロセス ‘sleep 10m’ が作成された時点から制御端末から切り離されていることを示しています。

setsid sleep 10m
ps -ef | grep sleep

ここで、セッションに再ログインすると、このプロセスが引き続き実行されていることがわかります。

ps -ef | grep [s]leep

結論

SSH セッションからログアウトした後でもプロセスを実行し続けるには、どのような方法が考えられますか?他に考えられる効率的な方法があれば、コメントで言及してください。