Criar tela e executar comando sem anexar

28

Estou trabalhando para automatizar uma rotina de manutenção que envolve iniciar e parar um script que está sendo executado em uma sessão de tela. Minha abordagem é matar a sessão da tela e, em seguida, reiniciá-la e executar o comando a partir de um script, usando as habilidades para criar uma tela e transmitir um comando sem a necessidade de anexar à tela.

No entanto, estou tendo dificuldades com isso. Eu posso criar a tela corretamente sem anexá-la 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 '\015''"command 2"'echo -ne '\015''

com o eco -ne '\ 015' sendo embrulhado com reticulares 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 tiver sido anexada uma vez criada. Como estou tentando automatizar o processo de criação da tela e execução dos comandos nela, gostaria de evitar ter que anexar e desanexar em 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 em um comando ou sem ter que se conectar à tela após a criação, mas antes da execução do comando?

Desde já, obrigado.

** Atualização - tendo tentado a sugestão de colocar os comandos que preciso executar em um script de shell, consegui criar uma tela com êxito e executar os comandos de dentro da tela, mas estou tendo o comportamento de que, quando o script parar de ser executado a tela também fecha. Isso não deve ser um problema, pois o script é um script de log que deve parar apenas com o conhecimento do administrador do sistema ou através do script que estou tentando desenvolver, no entanto, seria preferível ter a tela configurada de forma que a tela não desaparece se o script estiver parado. É possível alcançar esse comportamento? **

coffeecoder
fonte
11
Corri para este mesmo problema e encontrou uma solução no superuser.com para qualquer outra pessoa que se depara com este problema superuser.com/questions/342463/...
Dan Herbert
Para manter a tela aberta, você pode usar algo como: screen bash -c 'echo "test"; / bin / bash '
gwyn
11
Para o seu problema de fechamento automático, você pode usar um especial .screenrcque contenha a linha zombie kr, que manterá uma janela concluída aberta, e você pode pressionar kpara fechar o winodw ou rexecutar o comando na janela novamente. Eu tenho isso para o meu padrão .screenrc.
Martin C.

Respostas:

17

Eu acho que você pode estar enfrentando vários problemas.

Se o comando terminar antes de você reconectá-lo, a tela desaparecerá. Você pode demonstrar isso usando:

screen -d -m ls -l

Ele executará o ls -lcomando, mas screen -listnão o mostrará quando o processo de tela terminar.

Também não tenho ideia do que você está tentando fazer com esse material \ 015. Talvez atualizar sua pergunta ajudaria, pois 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 são muito usados, talvez você deva criar um script de shell que execute apenas esses comandos e use um método mais simples:

screen -d -m /path/to/script.sh
Michael Graff
fonte
existe uma maneira de obter um comportamento semelhante sem a tela desanexar imediatamente? Digamos que eu queira iniciar uma sessão ssh e desanexar logo após; screen -d -m sshserá desconectado no prompt de senha antes que a sessão seja feita.
estrela brilhante
Isso não funciona para mim. Substituir hte "commandN" por vários programas de longa duração resulta em nada aparecendo no screen -list. Além disso, isso não nomeia a tela como o OP está tentando fazer.
Cerin
Eu estava olhando para executar um programa python usando este método. Tentei criar um script sh para executá-lo, mas não vi a tela na lista. Em vez disso, usei screen -d -m python EventGenerator.py, o que funcionou muito bem
Dan Ciborowski - MSFT
11
Isso provavelmente deve ser bash -c "commands"em vez debash "commands"
marcovtwout
Você está certo, tem que haver -c.
Xdg 19/11/19
8

Iniciar uma tela desanexada

screen -dmS <screen name>

Executar comando na tela separada criada anteriormente

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

Sim, você precisa digitar o símbolo enter para enviar o comando, caso contrário, apenas adicionará a string à tela.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

Yogesh
fonte
11
o que é 'coisas'?
Nadav B
stuffé na verdade um comando que copia e cola outro comando em uma sessão da tela: stuff [string] Preencher a string de string no buffer de entrada da janela atual. É como o comando "colar", mas com muito menos sobrecarga. Sem um parâmetro, a tela solicitará uma seqüência de caracteres. Você não pode colar buffers grandes com o comando "stuff". É mais útil para ligações de teclas. Veja também "bindkey". [citado em theterminallife.com/sending-commands-into-a-screen-session/]
alisa 7/11
2

Eu já encontrei esse problema antes, era um bug na implementação do cygwin.

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

#detach
detach 

e então 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 desanexada e você é bom para fornecer comandos a ela.

Fácil ! : P

PiersyP
fonte
2

Isso fez o trabalho para mim, sem -cnão estar funcionando

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

Mazilu88
fonte
1

Uma maneira de copiar e colar para testar 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 uma tela e desanexá-la. 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 as sessões de tela disponíveis. Criadas no último comando.)

sleep 20; cat /tmp/h

(Isso catmostra o nome do host executado dentro da tela gnu)

Enrique S. Filiage
fonte
e qual é o resultado de tais testes?
precisa saber é o seguinte
Você está certo, não havia exemplo. Eu vou adicionar.
Enrique S. Filiage 20/08/19
muito melhor! merci! 1
Pierre.Vriens
0
screen -S test -d -m -- sh -c 'ls; exec $SHELL'
Nadav B
fonte