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.