Impedir que a tela GNU encerre a sessão quando o script executado terminar

35

Estou tentando forçar a tela do GNU a criar um terminal "virtual", sem anexá-lo, executar o script dentro e NÃO encerrar 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 recebo a sessão sem script executado, o script é executado, mas a sessão é encerrada quando termina ou estou recebendo o erro "Nenhuma sessão de tela encontrada".

O que eu basicamente estou tentando fazer é executar o ouvinte UDP, escrito em PHP e fazê-lo funcionar no loop infinte (não interrompa a escuta). Sim - eu poderia executar o script PHP &no final, forçando a CLI do PHP a ser executada como daemon. O problema é que estou usando um pedaço de lixo chamado servidor (QNAP - nunca compre esse lixo!), O que parece estar ignorando isso. Assim que eu saio da sessão SSH, os scripts param.

Então screenparece ser a única opção. Mas não consigo entender, por que ele termina a sessão depois que o comando ou script executado termina?

Edição : Eu também tentei exemplo encontrado na Internet:

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

Não falta! Depois de anexá-lo ( screen -R name), vejo que o Comandante da Meia-Noite NÃO foi executado. Embora o autor do exemplo tenha dito, será.

trejder
fonte
Do jeito que você está chamando screen, você cria apenas uma janela para executar um único comando. Quando o comando sai, a janela se fecha e screennão há mais nada a fazer, então sai.
Jw013 05/09/12
Então ... existe uma maneira de abrir duas janelas (usando apenas a linha de comando, sem combinações de teclado), uma para executar um script e a segunda para impedir o screenfechamento? BTW: Eu ainda não entendi a idéia! Se eu ligar screen -dmS name, crio uma janela desanexada, que também não tem mais nada a fazer. Mas não é fechado automaticamente! Mas quando eu quero executar algo nessa tela desanexada, ele termina quando a execução é concluída. Por quê? Não vejo lógica aqui. Pode ter janela fazendo nada, mas não pode ter janela fazendo alguma coisa e depois não fazendo nada?
Trejder
2
Quando você inicia uma janela sem especificar um comando, ele não está "fazendo nada". O "algo" que está fazendo está executando um shell interativo, que não sai até que você saia manualmente.
Jw013
Legal! Obrigado por uma explicação! Então ... voltando à pergunta ... existe alguma maneira de executar um comando dentro de uma tela / janela desanexada e NÃO para encerrar a sessão, assim que a execução do comando terminar? Além disso, dê uma olhada na pergunta atualizada. Obrigado.
trejder 5/09/12
Este script está executando dois ouvintes UDP escritos em PHP. Embora ambos sejam executados como daemons (com &no final), devido ao servidor de bugs (QNAP), eles são encerrados quando a sessão termina (disseram-me, eles não deveriam estar no Linux normal, se executados com &). Portanto, não pretendo fazer nada após a start_udp_listeners.shconclusão, apenas como impedir que a sessão seja encerrada. Enquanto isso não estiver, meus ouvintes de PHP estão funcionando bem.
Trejder

Respostas:

42

Para manter a tela ocupada após a conclusão do script, mantenha 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 bashcomo a escolha 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 recuperação mais fácil posteriormente
  • sh -c '...': em vez de simplesmente executar seu script, que será encerrado, use sh -cpara executar vários comandos
  • exec bash: depois que o script terminar, o shcomando acima mudará para um shell interativo ( bash), que nunca deve sair até que algo externo o encerre. Isso permanecerá screenaberto enquanto a bashinstância estiver viva.
jw013
fonte
1
Hm ... parece que você é o meu salvador da vida! :] Estender sua solução com export IGNOREEOF=1para impedir o término acidental com Ctrl + D deve me dar a solução perfeita. Estou procurando uma noite inteira. OBRIGADO! :]
Trejder
Isso não funciona no Debian a partir de hoje, -c é um argumento para ler um arquivo .screenrc alternativo ...
ToVine
O @ToVine funciona perfeitamente no Debian Stable (Wheezy). Eu usei bash -cembora.
TranslucentCloud
@TranslucentCloud você colocou todo o comando "bash -c ..." entre aspas? A última vez que tentou fazê-lo (à direita antes de escrever o comentário) não funcionou para mim, não muito certo porque ...
ToVine
@ToVine aqui é todo o meu comando:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud
2

Não tive sorte com o sh -cmeu raspberry pi 2 executando o Debian 7.8. Mas bash -cfez o trabalho:

Comando:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
scotty86
fonte
Pode ser porque você está usando (no Raspberry Pi) um shell diferente? O bashe shparece ser duas conchas diferentes. Acho que é tudo, mas posso estar errado, já que sou novato no Linux.
janel
1
sh é o unix-shell padrão, está incluído no raspbian (debian). O comando sh também funciona, mas não sh -c em combinação com a tela.
scotty86
Obrigado @ scotty86, observei o mesmo no Linux Mint 19 (Ubuntu 18.04) e mudei sh -cpara bash -co truque. Eu não entendo o porquê, ambos she bashestão instalados, então ainda estou perdendo o sono por causa disso, mas pelo menos funciona.
Redsandro 24/10
shprovavelmente aponta para em /bin/dashvez de /bin/bash. O Debian mudou o shell padrão de bashpara dashalguns anos atrás.
scai 12/03