Evita que a tela do GNU termine a sessão quando o script executado terminar

30

Estou tentando forçar a tela GNU a criar um terminal "virtual", sem anexar a ele, executar o script dentro e NÃO finalizar a sessão quando o script terminar.

Eu tentei muitas combinações, incluindo:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

ou

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

e nenhum deles funcionou. Eu obtenho sessão sem script executado, o script é executado, mas a sessão é encerrada assim que terminar ou estou recebendo o erro "Nenhuma sessão de tela encontrada".

O que eu estou basicamente tentando fazer é executar o ouvinte do UDP, escrito em PHP e fazê-lo funcionar em um loop infinito (não quebre a audição). Sim - eu poderia executar o script PHP com & no final, forçando o PHP CLI a executar como daemon. O problema é que eu estou usando um pedaço de lixo chamado servidor (QNAP - nunca, nunca compre este lixo!) Que parece estar ignorando isso. Assim que faço logoff na sessão SSH, os scripts param.

Portanto, screen parece ser a única opção. Mas eu não consigo entender, por que termina a sessão, uma vez executado o comando ou o script?

EDIT : Eu também tentei encontrar um exemplo na Internet:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

Não falta! Depois de anexar a ele ( screen -R name ), vejo que o Midnight Commander NÃO foi executado. Embora o autor do exemplo disse, será.

    
por trejder 05.09.2012 / 22:34

2 respostas

36

Para manter a tela ocupada após a conclusão do script, basta manter algo persistente em execução em uma janela. A escolha mais simples para esse "algo" é provavelmente um shell interativo. Aqui está uma maneira de fazer isso (assumindo bash como a opção do shell interativo):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm : inicia a tela no modo desanexado
  • -S : define o nome da sessão para a tela para facilitar a recuperação mais tarde
  • sh -c '...' : em vez de simplesmente executar seu script, que terminará, use sh -c para executar vários comandos
  • exec bash : depois que o script terminar, o sh acima mudará para um shell interativo ( bash ), que nunca deve sair até que algo externo o termine. Isso manterá screen aberto enquanto a instância bash estiver ativa.
por 05.09.2012 / 23:15
3

Eu não tive sorte com sh -c no meu raspberry pi 2 rodando o Debian 7.8. Mas bash -c fez o trabalho:

Comando:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
    
por 13.01.2016 / 19:41

Tags