画面内で画面プロセスを置き換える

画面内で画面プロセスを置き換える

exec screenスクリーンセッションですでに実行されていない場合は、シェルを起動するように設定しました。したがって、TTYでは、プロセスツリーは次のようになります。

login───screen───screen───zsh.

ほとんどすべての場合、これは私が望むものですが、時には画面なしで何かを実行したいと思い、通常の設定を変更せずにそうしたいと思います。トップレベルの画面プロセスを次のような他のもの(シェルなど)に置き換えるコマンドを探しています。

login───bash,

再度ログアウトし、myまたはuseを.zshrc一時的に変更する必要はありませんchsh

ベストアンサー1

なしでスクリーンセッションを開始する必要があります.zshrc。現在のプロセスを新しいプロセスに置き換えます。したがって、もはや存在しないので、元のプロセスに戻ることはできません。execscreenexec

で始めることができない場合は、execpstreeのようになります(-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の親が再割り当てされた理由です(その親はinit1のPIDを持っています)。 reconnectを呼び出すと、screen -r新しいPID(2112)を使用して新しい画面プロセスが作成されます。これらのscreenプロセスは、単純なUnixソケットまたは名前付きパイプを介して互いに通信します。

おすすめ記事