Crie tela e execute o comando sem anexar

25

Estou trabalhando na automação de uma rotina de manutenção que envolve iniciar e interromper um script em execução em uma sessão de tela. Minha abordagem é matar a sessão de tela e depois reiniciá-la e executar o comando a partir de um script usando as habilidades para criar uma tela e passar um comando sem precisar anexar à tela.

No entanto, estou tendo dificuldades com isso. Eu posso criar a tela corretamente sem anexar usando screen -d -m -S screen_name . No entanto, se eu executar um comando com base em:

screen -S screen_name-X stuff "command 1"'echo -ne '5''"command 2"'echo -ne '5''

com o echo -ne '\ 015' sendo empacotado com backticks em vez de aspas simples. É para simular o usuário pressionando a tecla enter, pois os comandos que eu uso estão se movendo para um diretório e executando um script localizado lá. Este comando funciona, mas somente se a tela foi anexada a uma vez que foi criada. Como estou tentando automatizar o processo de criação da tela e executar os comandos dentro dela, eu gostaria de evitar ter que anexar e desanexar dentro de um script. Tentarei sugerir a criação de um script de shell contendo os comandos que preciso executar na tela e editar de acordo com meus resultados.

Existe uma maneira de criar uma tela e executar um comando dentro da tela, seja em um comando ou sem precisar anexar a tela após a criação, mas antes da execução do comando?

Obrigado antecipadamente.

** Update - tendo tentado a sugestão de colocar os comandos que preciso executar dentro de um shell script, consegui criar uma tela com sucesso e executar os comandos de dentro da tela, mas estou obtendo o comportamento de quando O script para a execução da tela também é fechado. Isso não deve ser um problema, pois o script é um script de log que deve apenas parar com o conhecimento do administrador do sistema ou através do script que estou tentando desenvolver, no entanto, seria preferível ter a configuração da tela de tal forma que a tela não desaparece se o script estiver parado. É possível conseguir esse comportamento? **

    
por coffeecoder 20.01.2010 / 16:32

5 respostas

17

Acho que você pode estar se deparando com vários problemas.

Se o comando terminar antes de você anexar novamente, a tela irá embora. Você pode demonstrar isso usando:

screen -d -m ls -l

Ele executará o comando ls -l , mas screen -list não mostrará o processo de exibição da tela.

Eu também não tenho idéia do que você está tentando fazer com este material. Talvez a atualização da sua pergunta ajude, já que o que eu acho que você está tentando fazer é executar vários comandos em uma sessão de tela. Isso deve ser tão simples quanto:

screen -d -m bash -c "command1 ; command2 ; command3"

Se eles forem muito usados, talvez você deva criar um script de shell que execute apenas esses comandos e, em seguida, use um método mais simples:

screen -d -m /path/to/script.sh
    
por 20.01.2010 / 16:43
4

Iniciar uma tela separada

screen -dmS <screen name>

Executa o comando na tela desanexada criada anteriormente

screen -S <screen name> -X stuff '<CMD>\n'

Sim, você precisa digitar o símbolo de inserção para enviar o comando ou, caso contrário, ele adicionará a sequência à tela.

link

    
por 04.03.2011 / 11:56
2

Eu encontrei esse problema antes, era um bug com a implementação do cygwin.

O que eu fiz foi criar um ".screenrc_detaching" tendo apenas o seguinte comando

#detach
detach 

e, em seguida, inicie a tela com

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Então você tem sua sessão de tela e ela já foi anexada e desconectada e você é bom para enviar comandos para ela.

Fácil! : P

    
por 04.11.2011 / 14:49
2

Isso fez o trabalho para mim, sem -c não estava funcionando

screen -d -m bash -c "command1; command2; command3"

    
por 12.09.2016 / 10:04
1

Uma maneira de copiar e colar para testar as respostas anteriores é:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

O resultado esperado deve ser semelhante a:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Isso significa que nenhuma sessão de tela foi criada anteriormente)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(É o tempo gasto para criar tela e se destacar dela. Quase instantâneo.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Esta saída mostra sessões da tela disponíveis. Criado no último comando.)

sleep 20; cat /tmp/h

(Este cat mostra o nome do host executado dentro do gnu-screen)

    
por 17.08.2018 / 17:24