GNUスクリーンマニュアルは次のように言います:
`-d -m'
Start `screen' in _detached mode. This creates a new session
but doesn't attach to it. This is useful for system startup
scripts.
`-D -m'
This also starts `screen' in _detached_ mode, but doesn't fork
a new process. The command exits if the session terminates.
-dm
私は確信しています:
screen
提供されたコマンド(または何も指定されていない場合はシェル)を実行するために新しいプロセスをフォークします。- 「フォーク」は、奇妙なシュレディンガーのシステムコールを意味します。ここで、ソースコードは戻り値が観察されるまで戻り値が親か子かを知ることはできません。
- この新しいプロセスは
screen
添付できると見なされます。
私はそれが-dm
シェルのコントロールを返しますが、ブロックすることが-Dm
わかりました。
だから私の質問は次のようになります
- なぜブロックされるのです
-Dm
か?これが分岐のないものとどのような関係がありますか? - フォーク以外に何ができますか? 「分離モード」とは、プロセスが追加可能なPIDとして識別できることを意味するため、まだ新しいプロセスを作成すると思います。
-Dm
代わりにユースケースは何ですか-dm
?
ありがとうございます!
答え1
文書引用文の文脈ではscreen
、新しいプロセスをフォークする「へ」へ新しい子プロセスの開始「あまりにも遠くに進むリスクがありますが、プロセスのしくみについて考える方法は次のとおりです。子プロセスを作成するにはプロセスを使用する必要があります。fork(2)
中学校exec(2)
の親は次のことを選択できます。
- 子プロセス完了を呼び出します。つまり、子プロセスが終了するまでブロックし、呼び出しから終了ステータスを
wait(2)
返します。wait(2)
- 子プロセスが終了したことを知らせる信号を受信するまで続き
SIGCHLD
、この時点でwait(2)
終了状態を受信するために呼び出されます。 - 子プロセスを気にせずに終了します。この場合、プロセスの親は子プロセスの新しい親になります。
これを念頭に置いて、適用方法は次のとおりですscreen
。
screen -dm
自分のコマンドを実行し続けるために新しい(子)プロセスを作成し、そのプロセスから切り離したいことがよくあります。たとえば、これはコマンドがブロックされたくない~/.profile
古いシステムの文脈で意味があるかもしれません。/etc/rc.local
この場合、上記の子プロセスは実際のもう1つの部分でありscreen
、これは別の子プロセス(元の親プロセスの孫)として実際のコマンドプロセスを開始します。 2つの部分は通信し、screen
サブインスタンスはscreen
実際に必要なタスクを実行するためにコマンドサブインスタンスを管理します。
screen
時には監督者の管理下でそれを使いたいと思うかもしれませんsystemd
。たとえば、この場合、screen -Dm
管理者は管理されているプロセスがscreen
終了するかどうか、およびタイミングを識別して再開するために使用できます。子プロセスが分離されている場合screen
(現状のままscreen -dm
)、監督者はそのプロセスがまだ実行されているかどうかを簡単に知ることはできません。これらの-Dm
フラグを使用すると、screen
子プロセスにすべての機能を付与しながら、そのプロセスの存在を親プロセスに渡すことができます。この場合、screen
中間プロセス(子プロセス)は作成されず、親プロセスはscreen
実際に必要な操作を実行するコマンドサブプロセスを直接制御します。
考える
screen -dm sleep 30
- コマンドを実行した対話型シェルでは、screen
コマンドがsleep 30
まだ実行されているかどうかはわかりません。コメントはありません。screen -Dm sleep 30
- 対話型シェルはsleep 30
終了するまでブロックされます。この時点でもう実行されていないことがわかります。明らかに対話型セッションにはあまり役に立ちませんがsystemd
。