私は現在、SSH クライアントを使用して、研究室で使用しているサーバーに接続しています。バックグラウンドで実行されているセッションの概念について質問がありました。このコミュニティの質問を見てみました (バックグラウンドプロセスとは何ですか?)ですが、私が疑問に思っていることとは少し違うような気がします。
私たちが使用しているサーバー (サーバーの問題かインターネット接続の問題かはわかりません) に、プロセスを一晩中実行したままにして朝になるとシェル セッションが切断されるなどの問題が発生しています。
誰かが提案した解決策の1つは、プログラムを使用することですテムマックスこの問題を回避するには、プログラムが行うと主張しているのは、サーバーが切断されてもプロセスが妨げられないようにセッションをデタッチすることです。
プロセスがこのように「バックグラウンドで実行されている」とは、具体的にどういう意味なのか疑問に思いました。これは、上でリンクした質問と同じで、私が正しく理解していないだけでしょうか。また、セッションを「アタッチまたはデタッチする」とはどういう意味ですか。
私の混乱は、シェルが切断されたときにセッションがどのように実行されるのか理解できないことから生じていると思います。
ありがとう!
答え1
そのような概念が存在しないために、その概念を理解するのが困難になっています。 プロセスグループ背景/前景に配置できます。この概念は適用されませんセッションオペレーティング システムがセッションと呼ぶものでも、tmux
セッションを呼び出すものでもありません。これらはまったく異なるものです。
tmux
1つ以上の疑似端末を作成し、その中で実行されるプログラムがtmux
それを制御端末(および標準入力、出力、およびエラー)として認識します。マルチプレックスそれらの内部端子を1つにまとめる外側のターミナルは、SSH 経由でログインしたときにマシン上の SSH サーバーによって設定された疑似ターミナルになります。
2つのプロセスがありtmux
、長寿命のサーバ全ての内部擬似端末のバックエンド(つまり、もはや流行っていない用語で言えば「マスター」側)に接続し、クライアントそれは、そのサーバーと実現された外部端末との間の仲介役です。実際には、複数のクライアントが存在する可能性がありますが、それはここでは複雑であり、要点が変わらないため、ここでは省略します。
のサーバプロセスは、少なくとも1つの内部擬似端末が残っている限り存在します。擬似端末をコレクションにグループ化し、それがtmux
呼び出されます。セッションこれを、オペレーティングシステムがセッション(プロセスグループの集合とオプションで制御端末)と呼ぶものと混同しないでください。セッションSSH 経由 (リモート SSH サーバーとローカル SSH クライアント間)。「セッション」はさまざまな意味を持ちます。tmux
ここでは、「 」、「SSH」、「オペレーティング システム」など、さまざまな修飾語を使用していることに注意してください。
のクライアントこのプロセスは一時的なものであり、消え去る。取り外すSSH接続が失われ、セッションとサーバーからtmux
切断されます。SSHで再度ログインすると、新しいクライアント再接続するtmux
サーバー(によって管理されるセッション)に接続し、その新しいクライアントがtmux
サーバーのユーザーインターフェイスを実現します。ウィンドウズtmux
セッションとステータス ラインに、新しい SSH ログイン セッション用の新しい疑似端末が表示されます。クライアントはtmux
、現在接続されているセッションを一度に 1 つ認識します。
クライアントプロセスは、オペレーティングシステムがセッションと呼ぶものの一部であり、外側のSSHログイン用にSSHサーバーによって作成された擬似端末。これは、そのオペレーティングシステムセッションの存続期間に依存し、その存続期間はSSHセッションの存続期間に依存し、バックグラウンドまたはフォアグラウンドのプロセスグループに存在する可能性があります。その外側のターミナルの。それは(それによって)シェルジョブ制御その SSH セッションのログイン シェルの。
サーバープロセスは外部端末やオペレーティングシステムセッションから完全に切り離されており、それらの存続期間の影響を受けません。ありませんでバックグラウンドまたはフォアグラウンドのプロセスグループ。その寿命は、内側端末の I/O をクライアントに提供しますtmux
。
がある内側そして外側のターミナルがあります添付そして独立した tmux
セッションは、クライアントがサーバーに接続したりサーバーから切断したりすることからtmux
生じます。アクティブそして非活性セッション内のウィンドウtmux
。シェルのジョブ制御の概念は背景そして前景関与していません。
答え2
Unix プロセスは、主に次の 2 つの方法で「バックグラウンドで実行されている」と言えます。
シェルのような別のプロセスによって親が設定されます。Bourne
&
シェルで演算子を使用すると、次のようになります。sleep 10 &
この
sleep
プロセスはシェルによってバックグラウンドで実行されるため、実行を継続しますが、シェル プロンプトを操作して他のコマンドを実行することもできます。このようにバックグラウンドで実行されているプログラムが入力を読み取ろうとすると、シグナルによって停止されますSIGTTIN
。ただし、重要なのは、それが開始されたシェル プロセスに属しており、tty (実行されている端末) にまだ接続されているため、tty が閉じられると (ssh 接続が切断され、シェルが終了すると)、プロセスは で強制終了されることです
SIGHUP
。これはシェル ジョブ制御と呼ばれます。プロセスを または
&
またはbg
でバックグラウンドに置き^Z
、 でフォアグラウンドに戻したりfg
、jobs
などで一覧表示したりできます。これは実際には、別のコマンドで作業している間に 1 つのコマンドを一時的にバックグラウンドにするためのものであり、シェルが終了してターミナルが消えても安全である必要がある長時間実行プロセスを対象とするものではありません。デーモン プロセス。これは、親プロセスとその tty から完全に切り離されたプロセスです。新しいプロセス グループとセッション ID を持ち、その親は PID 1 です (通常は です
init
が、最近の Linux ではその役割を引き継いでいると思いますsystemd
)。デーモン プロセスはシェルによって親にされず、tty にも接続されていないため、シェルが終了したり tty が閉じられたりしても終了されません。システムまたはユーザーが明示的に終了する必要があります。ほとんどの Unix システムには、さまざまな作業を行うための多数のデフォルトのデーモンが付属しています。
これは大まかな説明であり、シェルのジョブ制御やデーモン プロセスについては、まだ触れていない詳細が多数あります。
というプログラムがあり、nohup
これを使うと、(1) シグナルを無視してプログラムを実行できるSIGHUP
ため、tty が閉じても終了しません。これで真のデーモンになるわけではありませんが、出力のみで入力を必要としない単純なジョブには適しています。
tmux はデーモンとして実行されるプログラムですが、その中で他のプログラム (シェルなど) を実行できます。tmux はより洗練されておりnohup
、フルスクリーン プログラムや、入力と出力の両方を必要とするプログラムを実行できます。デーモンであるため、tty が消えても (たとえば、ssh 接続が切断された場合) 終了されません。
tmux では、「アタッチ」とは、tmux が内部で実行中の 1 つ以上のプロセスをターミナル上に表示していることを意味します。そのターミナルから tmux を「デタッチ」し、後で別のターミナルに再度「アタッチ」することができます。SSH 接続が切断または強制終了された場合、デタッチは自動的に行われます。したがって、ターミナルと ssh を閉じて、後で別のターミナルから接続し、tmux をアタッチすると、すべてが元通りになります。