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


4

Eu li 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, posteriormente, criar uma nova janela na mesma sessão para outro script. Manualmente, eu:

  1. tela de execução
  2. comando enter
  3. CTRL+A
  4. CTRL+C
  5. comando enter
  6. CTRL+A
  7. CTRL+D

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

Obrigado pelas respostas.


Não entendo o que você quer dizer com janela na mesma sessão de tela. Deseja abrir duas janelas exibindo a saída do mesmo processo? Para que você está usando isso?
wingedsubmariner

Respostas:


0

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

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

#!/bin/bash
command1
screen command2

A execução de "tela" dentro da tela criará uma nova janela na sessão atual, não iniciará uma nova. Mas ele retornará imediatamente, portanto, após a última linha, o script será encerrado enquanto o comando2 ainda estiver em execução. E quando o comando2 for concluído, sua janela será fechada.

De qualquer maneira, a primeira interpretação da sua pergunta é um pouco mais difícil, então vamos em frente e resolva o exposto 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 será iniciado command1, espere até terminar e, em seguida, inicie command2e saia. Como se você corresse command1 ; command2 &, mas com a saída em outro lugar. Tenho certeza que você pode descobrir como executar command1em segundo plano.


Obrigado, preciso executar dois scripts que serão executados permanentemente. Será independente um do outro ... E ambos devem ser executados em segundo plano ... E eu preciso executar esses scripts após o início do Debian. Espero que agora esteja claro.
Mato

@ Matheus, por favor, tente entender o script - tudo o que você precisa fazer é remover o comando "touch" e o loop while que espera o arquivo aparecer. Você pode alterar o "zombie xy" para "zombie xy onerror" para que as janelas permaneçam por aí se os comandos terminarem com um erro ou sinal e você pode pular todo o material do screenrc se nunca se importar com o comandos depois que eles saem ou são mortos.
Gabe

e se você também pode perguntar ... Como posso corrigir com o script inid.d? Ou como eu posso corrigir terminar ou reiniciar com o script init.d?
Mato

Você precisa enviar o comando "encerrar" para a sessão da tela. Salve a variável $ SESSION em algum lugar e encerre tudo com "screen -S $ SESSION -X quit". Veja a "tela do homem" para mais informações.
Gabe

ok obrigado, e Provavelmente não é possível corrigir o cancelamento de apenas uma janela - um script na mesma tela via init.d script?
Mato

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á 2 sessões, uma editando xxx e yyy.

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

Isso não é muito conveniente, pois é necessário encontrar o número da sessão. É aí que -Sentra.

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 screen -r session1ouscreen -r session2


1
  1. Iniciar sessão startupe executar na janela desanexadacommand1
  2. Adicione 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'
    

Reconecte a sessão startupa qualquer momento

screen -r startup
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.