Obecnie piszę mój pierwszy program Pythona (w Pythonie 2.6.6). Program ułatwia uruchamianie i zatrzymywanie różnych aplikacji uruchomionych na serwerze, udostępniając użytkownikowi typowe polecenia (takie jak uruchamianie i zatrzymywanie usług systemowych na serwerze Linux).Jak mogę uruchomić proces i umieścić go w tle w pythonie?
Zaczynam skrypty startowe Applications' przez
p = subprocess.Popen(startCommand, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate()
print(output)
Problem polega na tym, że skrypt startowy z jednej aplikacji pozostaje na pierwszym planie, a więc p.communicate() czeka na zawsze. Próbowałem już użyć "nohup startCommand &" przed komendą startCommand, ale to nie działało zgodnie z oczekiwaniami.
Jako obejście Teraz używam następujący skrypt bash aby zadzwonić skrypt uruchomić aplikację za:
#!/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"
Skrypt bash jest wywoływana z mojego kodu Pythona. To obejście działa idealnie, ale wolałbym zrobić wszystko w pythonie ...
Czy podproces.Popen w niewłaściwy sposób? W jaki sposób mogę dołączyć do zadania tylko w Pythonie?
prawdopodobnie dupkiem http://stackoverflow.com/questions/1196074/starting- a-background-process-in-python – daTokenizer
Po prostu użyj komendy 'communic', kiedy jest to potrzebne ... nie musisz sprawdzać wyników? po prostu tego unikaj ... – klashxx
@klashxx: Potrzebuję wyników. To jest mój problem ... (trzeba sprawdzić wyjście dla "Serwer uruchomiony w trybie RUNNING" ...) – Ronzo