SSH またはセキュアシェル 簡単に言うと、人が他のシステム上の別のユーザーにリモートでアクセスできる方法ですが、コマンドライン、つまり非GUIモードでのみアクセスできます。より専門的に言えば、他のシステムで他のユーザーにSSHで接続し、そのマシンでコマンドを実行すると、実際に疑似端末が作成され、ログインしているユーザーのログインシェルに接続されます。
セッションからログアウトするか、かなりの時間アイドル状態になってからセッションがタイムアウトすると、 SIGHUP 信号は疑似端末に送信され、その端末で実行されたすべてのジョブは、親ジョブが疑似端末で開始されているジョブでもSIGHUP信号を送信され、強制的に終了されます。
>Don ' tミス: SSHサーバーを安全に保護するための5つの便利な方法
このシグナルを無視するように構成されたジョブのみが、セッションの終了後も存続します。 Linuxシステムでは、ユーザーのログアウトとセッションの終了後でも、これらのジョブをリモートサーバーまたは任意のマシンで実行するためのさまざまな方法があります。
Linuxでのプロセスを理解する
通常のプロセス
通常のプロセスとは、セッションの存続期間があるプロセスです。これらは、セッション中にフォアグラウンドプロセスとして開始され、特定の期間またはセッションがログアウトされたときに終了します。これらのプロセスの所有者は、rootを含むシステムの有効なユーザーのいずれかです。
孤立したプロセス
孤立したプロセスとは、最初にプロセスを作成した親があったプロセスですが、しばらくすると、親プロセスが意図せずに停止またはクラッシュし、initがそのプロセスの親になります。このようなプロセスには、直接の親としてinitがあり、プロセスが終了するか終了するまでこれらのプロセスを待機します。
デーモンプロセス
これらは意図的に孤立したプロセスであり、システム上で意図的に実行されたままになっているプロセスは、デーモンまたは意図的に孤立したプロセスと呼ばれます。これらは通常、長時間実行されるプロセスであり、一度開始されてから制御端末から切り離されるため、完了しないか、エラーが発生するまでバックグラウンドで実行できます。そのようなプロセスの親は故意に死に、子供をバックグラウンドで実行させます。
切断後もSSHセッションを実行し続けるための手法
以下に説明するように、切断後にsshセッションを実行したままにするさまざまな方法があります。
1。 screenコマンドを使用してSSHセッションを実行し続ける
画面 Linux用のテキストウィンドウマネージャーです。これにより、ユーザーは複数のターミナルセッションを同時に管理し、セッションを切り替えたり、画面上で実行中のセッションのセッションロギングを行ったり、セッションがログアウトされることを気にせずにいつでもセッションを再開したりできます。または端末が閉じています。
スクリーンセッションを開始してから制御端末から切り離すと、バックグラウンドで実行されたままになり、いつでもどこでも再開できます。画面上でセッションを開始する必要があり、必要に応じて、疑似端末(または制御端末)からセッションを切り離してログアウトします。感じたら、再ログインしてセッションを再開できます。
画面セッションの開始
「画面」と入力した後 コマンドを実行すると、新しい画面セッションになります。このセッションでは、新しいウィンドウを作成したり、ウィンドウ間を移動したり、画面をロックしたり、通常の端末で実行できるその他の多くのことを実行したりできます。
$ screen
スクリーンセッションが開始されると、任意のコマンドを実行し、セッションをデタッチすることでセッションを実行し続けることができます。
画面の切り離し
リモートセッションからログアウトしたいが、そのマシンで作成したセッションを存続させたい場合は、画面を端末から切り離して、制御端末が残らないようにするだけです。これを行った後、安全にログアウトできます。
リモート端末から画面を切り離すには、“Ctrl+a”
を押すだけです。 直後に“d”
が続きます 画面が切り離されたというメッセージが表示され、端末に戻ります。これで、安全にログアウトでき、セッションは存続します。
デタッチされたスクリーンセッションの再開
ログアウトする前に残した切り離された画面セッションを再開する場合は、リモートターミナルに再度ログインして、“screen -r”
と入力します。 1つの画面のみが開かれ、複数の画面セッションが開かれる場合は、“screen -r <pid.tty.host>”
を実行します。 。
$ screen -r $ screen -r <pid.tty.host>
screenコマンドとその使用方法の詳細については、次のリンクをたどってください:screenCommandを使用してLinuxターミナルセッションを管理する
2。 Tmux(ターミナルマルチプレクサー)を使用してSSHセッションを実行し続ける
Tmux 画面の代わりとして作成された別のソフトウェアです 。 画面のほとんどの機能を備えています 、画面よりも強力にする追加機能はほとんどありません。
画面で提供されるすべてのオプションとは別に、複数のウィンドウ間でペインを水平または垂直に分割、ウィンドウペインのサイズ変更、セッションアクティビティの監視、コマンドラインモードを使用したスクリプトなどが可能です。tmuxのこれらの機能により、ほぼ広く採用されています。すべてのUnixディストリビューション、さらにはOpenBSDのベースシステムに含まれています。
Tmuxセッションを開始する
リモートホストでsshを実行し、 tmuxと入力した後 、新しいウィンドウが目の前に開いた状態で新しいセッションに入ります。ここでは、通常の端末で行うことは何でもできます。
$ tmux
端末で操作を実行した後、そのセッションを制御端末から切り離して、バックグラウンドに移行し、安全にログアウトできるようにすることができます。
ターミナルからTmuxセッションを切り離す
“tmux detach”
を実行することもできます tmuxセッションの実行時、またはショートカット(Ctrl+b then d)
を使用できます 。この後、現在のセッションが切断され、安全にログアウトできる端末に戻ります。
$ tmux detach
クローズされたTmuxセッションの再開
システムからログアウトしたときに切り離してそのままにしておいたセッションを再度開くには、リモートマシンに再ログインして、「tmuxattach」と入力します。 閉じたセッションに再接続すると、セッションは引き続き存在し、実行されます。
$ tmux attach
tmuxとその使用方法の詳細については、リンクをたどってください:TmuxTerminalMultiplexerを使用して複数のLinuxターミナルを管理します。
3。 nohupコマンドを使用してSSHセッションを実行し続ける
画面にあまり詳しくない場合 またはtmux 、 nohupを使用できます 長時間実行されているコマンドをバックグラウンドに送信して、コマンドがバックグラウンドで実行され続けている間も続行できるようにします。その後、安全にログアウトできます。
nohupコマンドを使用して、 SIGHUPを無視するようにプロセスに指示します 終了時にsshセッションによって送信されるシグナル。これにより、セッションのログアウト後もコマンドが持続します。セッションログアウト時に、コマンドは制御端末から取得され、デーモンプロセスとしてバックグラウンドで実行され続けます。
バックグラウンドでnohupを使用してコマンドを実行する
これは単純なシナリオで、nohupを使用してsshセッションでバックグラウンドでファイルを検索するfindコマンドを実行しました。その後、タスクがバックグラウンドに送信され、プロンプトがすぐに返され、 PIDが返されます。 と仕事のID プロセスの([JOBID] PID)
。
# nohup find / -type f $gt; files_in_system.out 2>1 &
セッションを再開して、ジョブがまだ実行されているかどうかを確認します
再ログインすると、コマンドのステータスを確認し、'fg %JOBID'
を使用してコマンドをフォアグラウンドに戻すことができます。 その進行状況などを監視します。以下の出力は、再ログイン時に表示されないため、ジョブが完了したことを示しており、表示される出力を示しています。
# fg %JOBID
4。 disownコマンドを使用してSSHセッションを実行し続ける
コマンドまたは単一のタスクをバックグラウンドで実行し、セッションのログアウトまたは切断後も存続させるもう1つのエレガントな方法は、非表示を使用することです。 。
否認 、システムのプロセスジョブリストからジョブを削除します。これにより、プロセスは SIGHUP を受信しないため、セッションの切断中に強制終了されないように保護されます。 ログアウト時にシェルによって。
この方法の欠点は、 stdinからの入力を必要としないジョブにのみ使用する必要があることです。 どちらもstdoutに書き込む必要はありません 、ジョブの入力と出力を特にリダイレクトしない限り、ジョブが stdinと対話しようとするとき またはstdout 、停止します。
バックグラウンドでdisownを使用してコマンドを実行する
以下に、 pingを送信しました utが実行を継続し、ジョブリストから削除されるようにバックグラウンドにコマンドを送信します。ご覧のとおり、ジョブは最初に一時停止され、その後もプロセスID:15368としてジョブリストに残っていました。 。
$ ping tecmint.com > pingout & $ jobs -l $ disown -h %1 $ ps -ef | grep ping
その後、disownシグナルがジョブに渡され、バックグラウンドで実行されていたにもかかわらず、ジョブリストから削除されました。以下に示すように、リモートサーバーに再ログインしても、ジョブは引き続き実行されます。
$ ps -ef | grep ping
5。 setsidコマンドを使用してSSHセッションを実行する
必要な動作を実現するためのもう1つのユーティリティは、 setsidです。 。 Nohup プロセスのプロセスグループが同じままであるという意味で不利な点があります。そのため、nohupで実行されているプロセスは、プロセスグループ全体に送信されるシグナル(Ctrl + C
など)に対して脆弱です。 。
setsid 一方、実行中のプロセスに新しいプロセスグループが割り当てられるため、作成されたプロセスは完全に新しく割り当てられたプロセスグループに含まれ、セッションのログアウト後も強制終了されることなく安全に実行できます。
setsidを使用して任意のコマンドを実行します
ここでは、プロセスが‘sleep 10m’
であることを示しています。 作成時から制御端末から切り離されています。
$ setsid sleep 10m $ ps -ef | grep sleep
これで、セッションに再ログインしても、このプロセスが実行されていることがわかります。
$ ps -ef | grep [s]leep
結論
SSHセッションからログアウトした後でも、プロセスを実行し続けるためにどのような方法が考えられますか?他に考えられる効率的な方法がある場合は、コメントに記載してください。