
Estou executando um programa em uma sessão de tela. Se o programa travar, ele será reiniciado, mas quando o programa travar, a sessão de tela será encerrada.
Quero que a sessão da tela permaneça aberta para que o programa possa reiniciar sozinho. Existe alguma maneira de fazer isso?
Estou executando o Linux Debian 7 Wheezy
Responder1
A questão é: quão bizarro é o travamento do programa? As duas primeiras coisas que me vêm à mente:
- o programa envia em seu último suspiro algumas sequências de controle estranhas que
screen
também permitem travar/encerrar/pensar que é melhor não deixar você ver isso. - o programa envia sinais para seus processos pais (
screen
ou talvez um intermediárioconcha) que os encerra.
Próximas etapas que eu tentaria:
- Com que precisão foi
screen
encerrado? Ele mata todo oscreen
processo ou apenas sua própria janela (os comandos de tela em execução paralela ainda estão ativos, a sessão de tela é desconectada)? - Se você executar o programa a partir de um shell, você podecapturar sinaisvindo do programa usandoarmadilha?
- Ele ainda termina
screen
se você redirecionarsaída padrãoestderrpara um arquivo (o que o arquivo contém se não travar mais - estou curioso). Talvez você ainda possa assistir o programa rodando usandotail -f
. - OK, a evasão não fornecerá insights interessantes, mas existe o mesmo problema ao usar
tmux
em vez descreen
?
Edição 1 (anúncio 1): O programa que trava pode ser executado diretamente na tela, por exemplo
screen /usr/local/bin/your/crashing/program
ou com um processo de shell intermediário (por exemplo, você inicia sua janela de tela com seu shell favorito e depois executa o programa como
screen
/usr/local/bin/your/crashing/program
ou tenha um script de shell que renasça com algo como
bash -c 'while true ; do /usr/local/bin/your/crashing/program ; done'
Você pode saber pela saída pstree
quais processos estão envolvidos:
xterm(309)---bash(311)---screen(230)---screen(231)---bash(234)-+-less(323)
`-pstree(322)
No meu caso iniciei screen
(230 e 231) de um bash
(311) em uma xterm
janela (309) com outro bash
(234), da qual executei pstree | less
(322 e 323).
A tela termina se o processo filho terminar. Este é um comportamento normal e não uma falha. Portanto, se o seu programa for iniciado diretamente na tela e travar, a tela também será encerrada. Se você iniciou seu programa manualmente em um shell, esse shell deverá apresentar novamente seu prompt após o programa travar. Se a janela da tela fechar neste caso, algo está realmente estranho.
Seria útil conhecer um pouco o rodeio, por exemplo, como você inicia e reinicia seu programa.