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? **
fonte
.screenrc
que contenha a linhazombie kr
, que manterá uma janela concluída aberta, e você pode pressionark
para fechar o winodw our
executar o comando na janela novamente. Eu tenho isso para o meu padrão .screenrc.Respostas:
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:
Ele executará o
ls -l
comando, masscreen -list
nã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:
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:
fonte
screen -d -m ssh
será desconectado no prompt de senha antes que a sessão seja feita.screen -list
. Além disso, isso não nomeia a tela como o OP está tentando fazer.screen -d -m python EventGenerator.py
, o que funcionou muito bembash -c "commands"
em vez debash "commands"
Iniciar uma tela desanexada
Executar comando na tela separada criada anteriormente
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
fonte
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/]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
e então inicie a tela com
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
fonte
Isso fez o trabalho para mim, sem
-c
não estar funcionandoscreen -d -m bash -c "command1; command2; command3"
fonte
Uma maneira de copiar e colar para testar respostas anteriores é:
O resultado esperado deve ser semelhante a:
(Isso significa que nenhuma sessão de tela foi criada anteriormente)
(É o tempo gasto para criar uma tela e desanexá-la. Quase instantâneo.)
(Esta saída mostra as sessões de tela disponíveis. Criadas no último comando.)
(Isso
cat
mostra o nome do host executado dentro da tela gnu)fonte
fonte