Como posso iniciar uma nova janela na mesma sessão de tela automaticamente?

4

Eu leio Como posso iniciar várias sessões de tela automaticamente? , mas não entendo a primeira resposta aceita:

screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"

No meu caso, preciso criar automaticamente uma sessão de tela para um script e, depois, preciso criar uma nova janela na mesma sessão para outro script. Manualmente, gostaria de:

  1. executar tela
  2. digite o comando
  3. CTRL + A
  4. CTRL + C
  5. digite o comando
  6. CTRL + A
  7. CTRL + D

Como posso fazer isso automaticamente em um script? Um exemplo simples ajudaria muito.

Obrigado por respostas.

    
por Mato 30.10.2013 / 14:53

3 respostas

0

Não sei exatamente o que você quer que aconteça - você quer um script que crie a sessão de tela com duas janelas para dois comandos ou deseja executar um script em uma janela de tela que execute um comando e, em seguida, cria uma nova janela para o segundo?

O segundo é fácil, então vamos começar com isso:

#!/bin/bash
command1
screen command2

A "tela" em execução na tela cria uma nova janela na sessão atual, não inicia uma nova. Mas ele retornará imediatamente, portanto, após a última linha, o script sairá enquanto o comando 2 ainda estiver em execução. E quando o comando2 terminar, sua janela será fechada.

A primeira interpretação da sua pergunta é um pouco mais difícil, então vamos em frente e resolver o problema acima:

#!/bin/bash

# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"

# For signalling and stuff
FLAGDIR=$(mktemp -d)

# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc

# Use that temporary screenrc; create a detached session:
screen \
    -c ${FLAGDIR}/screenrc \
    -d -m \
    -S ${SESSION} \
    bash -c "command1 ; touch ${FLAGDIR}/done"

# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done

# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2

# Don't need this any more:
rm -rf ${FLAGDIR}

O script iniciará command1 , espere até que seja concluído, depois lance command2 e saia. Como se você estivesse executando command1 ; command2 & , mas com a saída em outro lugar. Tenho certeza de que você pode descobrir como executar command1 no plano de fundo.

    
por 30.10.2013 / 17:11
2

screen -dm cria uma sessão em segundo plano executando o comando que você especificou.

Então, se você colocar

screen -dm vi xxx
screen -dm vi yyy

no seu script, você terá duas sessões, uma edição xxx e a edição yyy.

screen -ls listará as sessões às quais você pode anexar usando screen -r <session number>

Isso não é muito conveniente, pois precisa encontrar o número da sessão. É aí que entra -S .

screen -dmS session1 vi xxx

criará uma sessão desanexada chamada session1, portanto, se você alterar seu script para

screen -dmS session1 vi xxx
screen -dmS session2 vi yyy

você pode escolher a sessão à qual deseja anexar com screen -r session1 ou screen -r session2

    
por 30.10.2013 / 16:53
1
  1. Iniciar sessão startup e executar na janela desanexada command1
  2. Adicione uma nova janela desanexada e execute command2

    screen -dmS startup bash -c 'command1; exec bash'
    screen -S startup -x -X screen bash -c 'command2; exec bash'
    

Recoloque a sessão startup a qualquer momento

screen -r startup
    
por 27.06.2016 / 00:28