Estou usando o seguinte comando para executar um script python em segundo plano:
nohup ./cmd.py > cmd.log &
Mas parece que o nohup não está gravando nada no arquivo de log. O cmd.log é criado, mas está sempre vazio. No script python, estou usando em sys.stdout.write
vez de print
imprimir na saída padrão. Estou fazendo algo errado?
nohup
você está usando? A versão do BSD grava em um arquivo chamadonohup.out
no diretório atual (ou$HOME/nohup.out
se o diretório atual não for gravável). Eu não vejo uma maneira de mudar o nome do arquivo de saída ...Respostas:
Parece que você precisa liberar o stdout periodicamente (por exemplo
sys.stdout.flush()
). Nos meus testes, o Python não faz isso automaticamente, mesmoprint
até a saída do programa.fonte
python -u
não funcionar;nohup
pode ter introduzido seu próprio buffer.nohup
não faz buffer de saída epython -u
funciona muito bem. (apenas uma atualização para as pessoas)nohup
é um utilitário POSIX , pode haver implementações diferentes em plataformas diferentes. btw, a E / S python3 não é mais baseada em C stdio, mas possui um comportamento de buffer semelhante.Você pode executar o Python com o
-u
sinalizador para evitar o buffer de saída:fonte
Usar
-u
comnohup
funcionou para mim. Usando-u
forçará ostdout
,stderr
córregos ser unbuffered. Não afetará o stdin. Tudo será salvo no arquivo " nohup.out ". Como isso-Você também pode salvá-lo em seu diretório. Deste jeito-
Além disso, você pode usar
PYTHONUNBUFFERED
. Se você configurá-lo como uma sequência não vazia, funcionará da mesma forma que a-u
opção. Para usar esta execução abaixo dos comandos antes de executar o código python.ou
PS : vou sugerir o uso de ferramentas como cron-job para executar coisas em segundo plano e execução agendada.
fonte
ou
https://docs.python.org/2/using/cmdline.html#cmdoption-u
fonte
Python 3.3 e acima tem um argumento de descarga para imprimir e este é o único método que funcionou para mim.
fonte
Eu tive um problema semelhante, mas não conectado a um processo Python. Eu estava executando um script que fazia um nohup e o script era executado periodicamente via cron.
Consegui resolver o problema da seguinte maneira:
PS: meus scripts foram escritos em ksh rodando no RHEL
fonte