Domanda

Quando corro direttamente in un terminale:

echo "useful"; sleep 10 &> /tmp/out.txt & echo "more";
.

Ottengo entrambe le uscite mentre il sonno va sullo sfondo.Ero lo stesso comportamento con PAPEN (Python 2.7):

p = Popen('echo "useful"; sleep 10 &> /tmp/out.txt & echo "more";', shell = True, stdout = PIPE, stderr = PIPE)
print p.communicate()
.

È stata la mia comprensione che un processo di sfondo con Stdout reindirizzato e Stderr realizzerebbe questo, ma non lo fa;Devo aspettare per dormire.Qualcuno può spiegare?

Ho bisogno dell'Altro output in modo che cambiano STDOUT / STDERR argomenti in Python non è una soluzione.


.

Modifica : Capisco ora che il comportamento che voglio (ottenere l'output ma si ferma quando non è possibile più output anziché quando completato) non è possibile da Python.

Tuttavia, il comportamento appare più o meno automaticamente quando si utilizza SSH:

ssh 1.2.3.4 "echo \'useful\'; cd ~/dicp/python; nohup sleep 5 &> /tmp/out.txt & echo \'more\';"
.

(posso ssh a questo indirizzo senza password).Quindi non è del tutto impossibile lavorare intorno a Python;Ora ho bisogno di un modo per farlo senza ssh

È stato utile?

Soluzione 2

Mentre Martijn Pieters sottolinea, questo non è come si comporta Python (o è destinato a comportarsi).Tuttavia, poiché il comportamento desiderato appare quando si esegue il comando tramite SSH con NOHUP, ho trovato questo trucco simile:

p = Popen('bash -c "echo \'useful\'; cd ~/dicp/python; nohup sleep 5 &> /tmp/out.txt & echo \'more\';"', shell = True, stdout = PIPE, stderr = PIPE)
print p.communicate()
.

Quindi se capisco correttamente, questo avvia una nuova shell (Bash -C), che quindi avvia un processo non collegato ad esso (NOHUP).La shell termina non appena tutti gli altri processi completi, ma il processo di nohup continua a funzionare.Descrivi il comportamento raggiunto!

Forse non carino e probabilmente non efficiente, ma funziona.

Modifica: supponendo, ovviamente, che stai usando Bash.Una risposta più generale è il benvenuto.

Edit2: In realtà, se la mia spiegazione è corretta, non sono sicuro del motivo per cui NHUP non staccò il processo anche se non usi BASH -C ... Sembra che Bash -c sia ridondante, solo scollegarlo dal guscio iniziatoda Popen, ma questo non funziona.

Altri suggerimenti

Questo perché il processo shell deve ancora aspettare che il processo di sfondo finisca.

Di solito non si rende conto che questo sta accadendo perché normalmente stai lavorando in la shell in cui hai background qualcosa.Metti un processo in background in modo da poter ottenere di nuovo il controllo del guscio e continuare a lavorare con esso.

In altre parole, il processo di sfondo è relativo alla shell, non al tuo processo Python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top