Você deve iniciar a sessão de tela em .zshrc sem exec , apenas screen . exec substitui o processo atual pelo novo. Então, você nunca voltará ao processo original porque não existe mais.
Se iniciado sem exec , pstree seria semelhante a este (adicionei -p ao pstree para mostrar os PIDs para compreensão):
|-login(857)---zsh(31597)---screen(1105)---screen(1108)---zsh(1109)-+-pstree(1209)
$ echo $$
1109
Estamos agora no processo filho do screen , portanto dentro do screen . Quando você agora quer executar algo fora do screen , feche o screen ou desanexe para ele com ctrl - a d . Novamente pstree :
|-screen(1108)---zsh(1109)
|-login(857)---zsh(31597)-+-pstree(1481)
$ echo $$
31597
A primeira linha é o screen destacado com um shell rodando dentro, o segundo o shell atualmente em execução (onde estamos agora). Como você vê, a variável $$ contém o PID do primeiro processo zsh .
Para voltar para a tela, basta ligar:
screen -r
Parece agora semelhante ao primeiro cenário:
|-screen(1108)---zsh(1109)-+-pstree(2118)
|-login(857)---zsh(31597)---screen(2112)
$ echo $$
1109
Observe o PID: Estou de volta ao shell que é filho de screen (1108). Esse screen process (1108) não é mais um processo filho da tela original (1105), porque esse processo não existe mais. É por isso que o 1108 foi reparado (seu pai agora é init com PID 1). No ponto em que chamei o screen -r para reconectar novamente, um novo processo de tela foi criado com um novo PID (2112). Esses processos screen falam sobre soquetes unix simples ou através de pipes nomeados um com o outro.