Estou trabalhando na automatização de uma rotina de manutenção que envolve iniciar e parar um script que está sendo executado em uma sessão de tela. Minha abordagem é encerrar a sessão da tela e, em seguida, reiniciá-la e executar o comando de dentro 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. Posso criar a tela corretamente sem anexá-la usando screen -d -m -S screen_name
. No entanto, se eu executar um comando baseado em:
screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''
com o echo -ne '\015' sendo colocado entre crases em vez de aspas simples. É para simular o usuário pressionando a tecla Enter enquanto os comandos que utilizo vão para um diretório e executam um script localizado lá. Este comando funciona, mas apenas se a tela tiver sido anexada depois de criada. Como estou tentando automatizar o processo de criação da tela e execução dos comandos dentro dela, gostaria de evitar ter que anexar e desconectar dentro de um script. Estarei tentando a sugestão de criar um shell script contendo os comandos que preciso executar dentro da 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 precisar anexar à tela após a criação, mas antes da execução do comando?
Desde já, obrigado.
** Atualização - depois de tentar 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 obtendo o comportamento de quando o script para de ser executado a tela também fecha. Isso não deve ser um problema, pois o script é um script de registro que só deve parar com o conhecimento do administrador do sistema ou através do script que estou tentando desenvolver, porém seria preferível ter a tela configurada de tal forma que a tela não desaparece se o script for interrompido. É possível alcançar esse comportamento? **
Responder1
Acho que você pode estar enfrentando vários problemas.
Se o comando terminar antes de você reconectar, a tela desaparecerá. Você pode demonstrar isso usando:
screen -d -m ls -l
Ele executará o ls -l
comando, mas screen -list
não o mostrará quando o processo da tela for finalizado.
Também não tenho ideia do que você está tentando fazer com esse material \015. Talvez atualizar sua pergunta ajude, pois o que 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, em seguida, use um mais simples:
screen -d -m /path/to/script.sh
Responder2
Iniciar uma tela separada
screen -dmS <screen name>
Execute o 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 ou então apenas adicionará a string à tela.
Responder3
Isso fez o trabalho para mim, sem -c
não estava funcionando
screen -d -m bash -c "command1; command2; command3"
Responder4
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 a tela e se separar 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 de tela disponíveis. Criadas no último comando.)
sleep 20; cat /tmp/h
(Isso cat
mostra o nome do host executado dentro da tela gnu)