Continue executando o programa que requer o servidor X após o logoff da sessão ssh

2

Eu tenho um script python que gera periodicamente uma imagem png e a coloca em um servidor que eu possa acessar através de um navegador. A imagem exibe o progresso de um trabalho que estou executando no servidor. Estou usando o matplotlib para gerar as imagens.

O script python vai dormir depois de gerar cada imagem. Depois de uma hora, ele acorda, gera uma nova imagem e volta a dormir.

Eu inicio o script em uma sessão ssh. Quando eu faço logoff, o script é morto. Eu li os outros tópicos que cobrem esse problema, mas as soluções propostas não funcionam. O script é morto depois que eu fizer logoff, mesmo se eu o executar com

nohup script.py &> job-monitor.log &

ou se eu executo assim

script.py
[Ctrl-Z]
disown -h %1
bg 1

O mais estranho é que, quando eu faço logoff e faço login novamente, o script não está mais em execução e o job-monitor.log está vazio.

O que poderia estar acontecendo e como faço para que o script continue sendo executado após o logoff?

Informações adicionais: Eu acho que o problema tem a ver com a biblioteca de plotagem que estou usando, matplotlib. Eu acho que pode exigir uma sessão X para produzir um png, mesmo que o gráfico esteja sendo salvo em disco.

    
por Thucydides411 22.09.2013 / 15:02

4 respostas

3

Se o problema for com o matplotlib (ou seja, seu script nunca fornecer uma resposta se você permanecer conectado ou funcionar porque o ssh encaminha sua conexão do Xwindow), será necessário colocar o arquivo matplotlibrc:

backend : AGG

Desta forma, o script não precisa de Xwindow para funcionar.

    
por 23.09.2013 / 13:19
0

Em vez de IO/redirecting use tmux ou screen command para monitoramento de sessão.

    
por 22.09.2013 / 17:24
0

Posso sugerir humildemente que você jogue fora a parte time.sleep() do seu script e use cron ou at para invocações periódicas e / ou atrasadas?

Isso simplifica o seu código, remove com segurança as dependências do destacamento de sessão ssh e separa as preocupações de geração e agendamento de imagens.

Em relação ao script morrer: suspeito que o script após nohup possa não ter acesso de gravação ao arquivo de log, porque ele não tem acesso de gravação ao diretório em que foi iniciado ou porque um arquivo de log existente é de propriedade por exemplo raiz e, portanto, inacessível.

Eu não sei se rejeitar um trabalho e então tentar chamar bg contra ele deve funcionar. Eu sempre faço o oposto: foo & disown %1 ; funciona exatamente em circunstâncias como a sua.

    
por 23.09.2013 / 08:22
-1

Tente redirecionar STDIN também. É possível que o script esteja lendo stdin, então quando você fecha o shell, o stdin desaparece e ele morre.

script.py </dev/null &>/dev/null &
disown
    
por 22.09.2013 / 17:54