Seite 1 von 1
Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 10:25
von gobo38
Hallo !
gerade angemeldet und schon kommt eine Frage..
Mein Problem liegt in der Formatierung eines Strings der bei Subprocess übergeben werden soll.
das kleine script sollte einfach nachsehen wie die Pid von "meinprogramm" ist und dann prüfen ob das Programm läuft oder nicht.
auf der CL funktioniert das Ganze mit
Code: Alles auswählen
ps up `cat /tmp/xmlrpcserver.pid ` >/dev/null && echo "Running" || echo "Not running"
einwandfrei
bei meinem Python script bekomme ich nur die Fehlermeldung "error: process ID list syntax error"
Code: Alles auswählen
import subprocess
data = ['ps', 'up', '`cat /tmp/meinprogram.pid `', '>/dev/null', '&&', "echo 'Running'", '||', "echo 'Not running'"]
output = subprocess.Popen(data, stdout=subprocess.PIPE)
print output.communicate()
Da ich nach stundenlangem googlen und ausprobieren schon kurz vor dem Wahnsinn stehe hoffe ich hier auf Hilfe!
LG
Günther
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 10:48
von BlackJack
@gobo38: Das was Du da ausführen willst ist kein Programm was man einfach so starten kann sondern eine Zeile die von der Shell interpretiert werden muss weil die da deutlich mehr mit macht als einfach nur ein Programm zu starten.
Das hier würde gehen:
Code: Alles auswählen
command = [
'sh',
'-c',
'ps up `cat /tmp/xmlrpcserver.pid` >/dev/null && echo "Running" || echo "Not running"'
]
Allerdings wirft das die Frage auf warum Du dann überhaupt Python benutzt. Ich würde das `psutil`-Modul installieren und das ohne `subprocess` lösen.
Edit: Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python
from __future__ import print_function
import errno
from psutil import pid_exists
def is_process_running(pid_filename):
try:
with open(pid_filename) as pid_file:
return pid_exists(int(next(pid_file)))
except OSError as error:
if error.errno == errno.ENOENT:
return False
else:
raise
def main():
if is_process_running('/tmp/xmlrpcserver.pid'):
print('Running')
else:
print ('Not Running')
if __name__ == '__main__':
main()
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 11:01
von gobo38
@BlackJack
Super, danke Dir !
Ich muss hier leider auf Subprocess ausweichen, da dieses Script auf einem Server läuft auf dem ich leider keine Module installieren kann/darf.
Außerdem soll ja noch mehr passieren als nur die Abfrage, ich hab nur den für die Frage relevanten Code eingefügt.
Nochmals Danke, so kann ich was damit anfangen.
LG
Günther
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 11:12
von BlackJack
@gobo38: Selbst dann würde ich mehr nach Python verlagern, denn die Umleitung nach ``/dev/null``, das Auslesen der PID-Datei, und das Auswerten des Rückgabecodes muss alles nicht die Shell machen. Eigentlich ist nur das ``ps`` nicht so einfach in Python zu lösen. Es sei denn man ist sicher, dass es ein ``/proc/``-Verzeichnis auf dem Server gibt, dann könnte man dort nachschauen ob es einen Process mit der PID (ungetestet):
Code: Alles auswählen
def is_process_running(pid_filename):
try:
with open(pid_filename) as pid_file:
return os.path.exists(os.path.join('/proc', next(pid_file).strip()))
except OSError as error:
if error.errno == errno.ENOENT:
return False
else:
raise
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 11:19
von gobo38
@BlackJack
mhhhhh, interessanter Ansatz.
Ich denke das werde ich versuchen umzusetzen. Ich berichte dann ob es funktioneirt
lG
Günther
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 11:57
von Sirius3
@gobo38: nur weil BlackJack immer Lösungen ohne subprocess postet; natürlich kann man auch "ps" mit subprocess benutzen:
Code: Alles auswählen
def is_process_running(pid_filename):
with open(pid_filename) as pid_file:
with open('/dev/null', 'w') as dev_null:
return not subprocess.Popen(['ps', 'up', next(pid_file).strip()], stdout=devnull, stderr=devnull).wait()
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 12:26
von gobo38
@Sirius3
Wunderbar, danke! Wieder ein Ansatz. Ich bin guter Dinge
Nun, zur Ehrenrettung von BlackJack muss ich sagen dass er mir in seinem ersten Posting einen Ansatz mit Subprocess gegeben hat der tadellos funktioniert
Egal, ich werde mal die verschiedenen Varianten ausprobieren.
LG
Günther
Re: Problem mit subprocess
Verfasst: Mittwoch 26. Februar 2014, 12:31
von BlackJack
Statt '/dev/null/' kann man auch `os.devnull` verwenden, falls man ein Betribssystem hat bei dem es zwar ``ps`` gibt, aber wo ``/dev/null`` anders heisst. Falls es so etwas gibt.
