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.

Mato
fonte
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.

Gabe
fonte
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

parkydr
fonte
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
Yuriy Tumakha
fonte