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


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

セッションからログアウトするか、かなり長い間アイドル状態になってからセッションがタイムアウトすると、SIGHUPシグナルが疑似端末と、その端末で実行されたすべてのジョブ(親ジョブを持つジョブも含む)に送信されます。疑似端末で開始されたものもSIGHUP信号が送信され、強制的に終了されます。

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

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

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

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

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

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

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

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

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

「screen」コマンドを入力すると、新しい画面セッションが開始されます。このセッションでは、新しいウィンドウを作成したり、ウィンドウ間を移動したり、画面をロックしたり、通常の端末で実行できるその他の多くの操作を実行したりできます。

$ screen

スクリーンセッションが開始されると、任意のコマンドを実行し、セッションをデタッチすることでセッションを実行し続けることができます。

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

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

ログアウトする前に残した切り離された画面セッションを再開する場合は、リモート端末に再度ログインし、1つの画面しか開かない場合、および複数の画面がある場合は、“ screen -r” と入力します。スクリーンセッションが開かれると、“ screen -r を実行します。

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

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

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

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

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

$ tmux

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

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

$ tmux detach

システムからログアウトしたときに切り離してそのままにしておいたセッションを再度開くには、リモートマシンに再ログインし、「tmux attach」と入力して、閉じたセッションに再度接続します。セッションは引き続き存在し、実行されます。 。

$ tmux attach

tmuxとその使用方法の詳細については、次のリンクをたどってください:Tmux TerminalMultiplexerを使用して複数のLinuxターミナルを管理します。

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

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

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

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

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

# fg %JOBID

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

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

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

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

$ ping tecmint.com > pingout &
$ jobs -l
$ diswon -h %1
$ ps -ef | grep ping

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

$ ps -ef | grep ping

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

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

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

$ setsid sleep 10m
$ ps -ef | grep sleep

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

$ ps -ef | grep [s]leep

結論

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