Attualmente sto scrivendo il mio primo programma python (in Python 2.6.6). Il programma facilita l'avvio e l'arresto di diverse applicazioni in esecuzione su un server fornendo all'utente comandi comuni (come l'avvio e l'arresto di servizi di sistema su un server Linux).Come posso avviare un processo e metterlo in background in python?
Sto iniziando script di avvio delle applicazioni da
p = subprocess.Popen(startCommand, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate()
print(output)
Il problema è che lo script di avvio di un'applicazione rimane in primo piano e in modo p.communicate() attende per sempre. Ho già provato a utilizzare "nohup startCommand &" davanti a startCommand ma non ha funzionato come previsto.
Come una soluzione che ora utilizzare il seguente script bash per chiamare script di avvio dell'applicazione:
#!/bin/bash
LOGFILE="/opt/scripts/bin/logs/SomeServerApplicationStart.log"
nohup /opt/someDir/startSomeServerApplication.sh >${LOGFILE} 2>&1 &
STARTUPOK=$(tail -1 ${LOGFILE} | grep "Server started in RUNNING mode" | wc -l)
COUNTER=0
while [ $STARTUPOK -ne 1 ] && [ $COUNTER -lt 100 ]; do
STARTUPOK=$(tail -1 logs/SomeServerApplicationStart.log | grep "Server started in RUNNING mode" | wc -l)
if ((STARTUPOK)); then
echo "STARTUP OK"
exit 0
fi
sleep 1
COUNTER=$(($COUNTER + 1))
done
echo "STARTUP FAILED"
Lo script bash è chiamata dal mio codice python. Questa soluzione funziona perfettamente, ma preferirei fare tutto in python ...
È un sottoprocesso.Popen nel modo sbagliato? Come potrei completare il mio compito solo in Python?
probabilmente un doppio di http://stackoverflow.com/questions/1196074/starting- a-background-process-in-python – daTokenizer
Basta usare 'communicate' quando è necessario .. non è necessario controllare i risultati? basta evitarlo ... – klashxx
@klashxx: ho bisogno dei risultati. Questo è il mio problema ... (è necessario controllare l'output di "Server avviato in modalità RUNNING" ...) – Ronzo