exec screen
スクリーンセッションですでに実行されていない場合は、シェルを起動するように設定しました。したがって、TTYでは、プロセスツリーは次のようになります。
login───screen───screen───zsh.
ほとんどすべての場合、これは私が望むものですが、時には画面なしで何かを実行したいと思い、通常の設定を変更せずにそうしたいと思います。トップレベルの画面プロセスを次のような他のもの(シェルなど)に置き換えるコマンドを探しています。
login───bash,
再度ログアウトし、myまたはuseを.zshrc
一時的に変更する必要はありませんchsh
。
ベストアンサー1
なしでスクリーンセッションを開始する必要があります.zshrc
。現在のプロセスを新しいプロセスに置き換えます。したがって、もはや存在しないので、元のプロセスに戻ることはできません。exec
screen
exec
で始めることができない場合は、exec
次pstree
のようになります(-p
理解のためにPIDを表示するためにpstreeに追加しました)。
|-login(857)---zsh(31597)---screen(1105)---screen(1108)---zsh(1109)-+-pstree(1209)
$ echo $$
1109
我々は現在、サブプロセスにあるので、screen
閉じるscreen
以外screen
の操作を実行するか、screen
- を使用して分離したい場合 。再:ctrla dpstree
|-screen(1108)---zsh(1109)
|-login(857)---zsh(31597)-+-pstree(1481)
$ echo $$
31597
最初の行はscreen
内部で実行されているシェルから切り離され、2行目は現在実行されているシェル(現在の場所)です。ご覧のとおり、この$$
変数には最初のプロセスのPIDが含まれていますzsh
。
画面に戻るには、次を呼び出します。
screen -r
これで最初のシナリオに似ています。
|-screen(1108)---zsh(1109)-+-pstree(2118)
|-login(857)---zsh(31597)---screen(2112)
$ echo $$
1109
PIDを確認してください。 (1108)のサブシェルに戻りましたscreen
。このscreen
プロセス1108はもはや存在しないので、元の画面1105の子ではない。これが1108の親が再割り当てされた理由です(その親はinit
1のPIDを持っています)。 reconnectを呼び出すと、screen -r
新しいPID(2112)を使用して新しい画面プロセスが作成されます。これらのscreen
プロセスは、単純なUnixソケットまたは名前付きパイプを介して互いに通信します。