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 screen
parece 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á.
fonte
screen
, você cria apenas uma janela para executar um único comando. Quando o comando sai, a janela se fecha escreen
não há mais nada a fazer, então sai.screen
fechamento? BTW: Eu ainda não entendi a idéia! Se eu ligarscreen -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?&
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 astart_udp_listeners.sh
conclusão, apenas como impedir que a sessão seja encerrada. Enquanto isso não estiver, meus ouvintes de PHP estão funcionando bem.Respostas:
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
bash
como a escolha do shell interativo):-dm
: inicia a tela no modo desanexado-S
: define o nome da sessão para a tela para recuperação mais fácil posteriormentesh -c '...'
: em vez de simplesmente executar seu script, que será encerrado, usesh -c
para executar vários comandosexec bash
: depois que o script terminar, osh
comando acima mudará para um shell interativo (bash
), que nunca deve sair até que algo externo o encerre. Isso permaneceráscreen
aberto enquanto abash
instância estiver viva.fonte
export IGNOREEOF=1
para impedir o término acidental com Ctrl + D deve me dar a solução perfeita. Estou procurando uma noite inteira. OBRIGADO! :]bash -c
embora.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
Não tive sorte com o
sh -c
meu raspberry pi 2 executando o Debian 7.8. Masbash -c
fez o trabalho:Comando:
fonte
bash
esh
parece ser duas conchas diferentes. Acho que é tudo, mas posso estar errado, já que sou novato no Linux.sh -c
parabash -c
o truque. Eu não entendo o porquê, ambossh
ebash
estão instalados, então ainda estou perdendo o sono por causa disso, mas pelo menos funciona.sh
provavelmente aponta para em/bin/dash
vez de/bin/bash
. O Debian mudou o shell padrão debash
paradash
alguns anos atrás.