私はDebian Wheezy(スクリーンバージョン)を実行しているコンピュータを持っています。4.01.00 開発)と別のDebian Squeeze(スクリーンバージョン)4.00.03jw4)そして、これら2つの画面の下で、screenという別のプロセスを自動的に起動します。たとえば、
init(1)-+-acpid(1926)
|-sshd(2139)---sshd(2375)---bash(2448)---screen(6649)---screen(6650)-+-bash(6651)---pstree(6751)
ps
PID 6649コマンドによると、screen
PID 6650コマンドは次のようになりますSCREEN
。
root@vserver:~# ps -f -p 6650
UID PID PPID C STIME TTY TIME CMD
root 6650 6649 0 11:26 ? 00:00:00 SCREEN
root@vserver:~#
なぜscreen
これが起こるのですか?
答え1
外部(PID 6649)は起動した端末に接続し、(+、)を外すと終了しますscreen
。Ctrlad
内部screen
(PID 6650)いいえこの端末に接続するのではなく、bash
この端末で起動されたデバイスが接続される自己疑似端末(pty)デバイスを制御します。
外部端末に何かを入力すると、外部端末がscreen
それを受け取り、ソケットを介して内部画面に送信し、入力を制御するptyに渡し、最終的にbash
(または他のプログラムに到達します))はbashで始まり、同じptyをを介して制御されます。 bashの出力(またはここで開始されたすべてのプログラム)はinnerscreen
のptyに送信され、これにより内部はscreen
ソケットを介して外部に送信され、screen
最終的に起動した端末に送信されますscreen
(あなたの場合は再び次のようになります)。 ptyコンストラクタssh
によってソケットが生成されます。内部に screen
、取り外し、再接続が可能です(下記参照)。
インスタンスを分離すると、インスタンスが制御する内部とptyが存在し続けますscreen
。screen
これが接続プロセスがI/Oを試みても生き残る理由です。ただし、外部端末がscreen
終了し、外部端末の接続が切断されます。たとえば、ssh
セッションを終了してその pty を削除することができ、それ自体のscreen
pty デバイスを介して通信するため、内部的にまたはそのプログラムによって開始されたプログラムには影響しません。
もう一度ログインし(別のptyを作成し)、screen -r
呼び出しの内部インスタンスに再接続し、その後再表示するために独自のptyの現在の状態を「外部」に送信します。 I / O転送ラインは、外部インスタンスに対して以前と同じように発生します。screen
screen
screen
screen
screen
今一つ作ればpstree
見つけることができます。二つLines: 1 つは新しい「外部」インスタンスで始まり、終了しscreen
、もう 1 つは分離時に親インスタンスがなくなった「内部」インスタンスで始まります。sshd
screen
screen
screen
簡単に言うと:
- 「外部」画面(PID 6649)は、対話している端末(あなたの場合によって生成されたpty
ssh
)に接続され、インスタンスに接続されている間にのみ存在しますscreen
。 - 「内部」画面(PID 6650)は、画面の下で始まるプログラムに別々のptyを提供し、外部インスタンスと内部インスタンス間で端末状態を渡すためのソケットも提供します
screen
。終了するまでscreen
(分離しない)ままです。 - この分離は、制御されたプログラムが外部ptyが終了した後も生き残ることができるようにするために必要です(他のptyに接続して、ptyとその制御プロセス(内部
screen
)は外部端末から分離されても生き残ります)。内部は、screen
接続できるソケットの新しいインスタンスを提供しますscreen
。
答え2
2番目のプロセス(例では、PIDが6650のプロセス)の理由は、ログアウトできるようにtty接続(stdin、stdout、およびstderr)を閉じることです。後でもう一度ログインして画面をもう一度確認してください。
ご覧のとおり、PID 6650はttyに接続されていません(TTY列に「?」が表示されています)。