Substituir processo de tela de dentro da tela

3

Eu configurei meu shell para exec screen quando ele é iniciado, a menos que ele já esteja sendo executado em uma sessão de tela. Então, em um TTY, a árvore do processo se parecerá com algo assim:

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

Em quase todos os casos, isso é o que eu quero, mas às vezes eu gostaria de executar algo sem tela, e gostaria de fazer isso sem alterar minha configuração usual. Estou à procura de um comando que substitua o processo de tela superior por alguma outra coisa, por exemplo, um shell, como este:

login───bash,

sem ter que fazer o logout e fazer alterações temporárias no meu .zshrc ou usar chsh .

    
por iia 06.05.2015 / 10:43

3 respostas

1

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.

    
por 06.05.2015 / 11:41
1

O que eu recomendaria, em vez de substituir o shell com a tela, basta ativá-lo ou anexá-lo com base na existência ou não de uma tela, então você tem a liberdade de separar com ctrl + um - d

if [[ ! $(screen -ls 2>&1) =~ .*No.Sockets.* ]] ; then 
  screen -U -x 
else 
  echo 'No existing screen sockets found, launching screen!'; screen -U -S session -s 'which zsh'
fi

Deve-se colar ~ em ~ / .bash_profile ou ~ / .bashrc e depois definir o shell padrão do seu usuário para bash. Isso gerará novos processos zsh toda vez que você criar novas janelas de tela e sempre reconectá-lo à sua sessão de tela ou iniciar um novo caso ele não esteja em execução. Dessa forma, você poderia retirar da tela e executar as coisas fora dela. E se, por exemplo, você quisesse mover um dos processos que já estava na tela, poderia fazê-lo com algo como reptyr .

    
por 07.12.2017 / 17:48
0

O método a seguir é talvez um pouco complicado, mas pode ser uma solução para sua pergunta.

Você pode criar uma cópia do usuário editando o arquivo / etc / passwd e duplicar a linha do usuário. Altere apenas o nome de usuário (primeiro campo). Defina uma senha para o seu 'novo' usuário por passwd newuser . Por fim, altere seu .zshrc e substitua o exec screen por uma verificação no nome de usuário:

if [ "'id -un'" != "newuser" ]
then
    exec screen
fi

Quando você deseja ter uma sessão sem exec screen , é possível fazer login com o usuário alternativo, que na verdade é o mesmo que seu usuário comum.

Talvez existam alternativas melhores para o que você está tentando alcançar, mas isso pode ajudá-lo ...

    
por 06.05.2015 / 12:27