Problem mit subprocess

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gobo38
User
Beiträge: 4
Registriert: Mittwoch 26. Februar 2014, 10:03
Kontaktdaten:

Hallo !
gerade angemeldet und schon kommt eine Frage.. :wink:

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
My hardeware runs better without Windows... ;)
@work Linux Mint Debian , python 2.7 - CentOs 5.6, python 2,7
@home Linux Mint Debian, Open SuSe 12,1 , python 2,7 - MAC OsX Maverick
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()
gobo38
User
Beiträge: 4
Registriert: Mittwoch 26. Februar 2014, 10:03
Kontaktdaten:

@BlackJack

Super, danke Dir ! :D :D

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. :D

LG
Günther
My hardeware runs better without Windows... ;)
@work Linux Mint Debian , python 2.7 - CentOs 5.6, python 2,7
@home Linux Mint Debian, Open SuSe 12,1 , python 2,7 - MAC OsX Maverick
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
gobo38
User
Beiträge: 4
Registriert: Mittwoch 26. Februar 2014, 10:03
Kontaktdaten:

@BlackJack

mhhhhh, interessanter Ansatz. 8)

Ich denke das werde ich versuchen umzusetzen. Ich berichte dann ob es funktioneirt

lG
Günther
My hardeware runs better without Windows... ;)
@work Linux Mint Debian , python 2.7 - CentOs 5.6, python 2,7
@home Linux Mint Debian, Open SuSe 12,1 , python 2,7 - MAC OsX Maverick
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
gobo38
User
Beiträge: 4
Registriert: Mittwoch 26. Februar 2014, 10:03
Kontaktdaten:

@Sirius3

Wunderbar, danke! Wieder ein Ansatz. Ich bin guter Dinge :lol:

Nun, zur Ehrenrettung von BlackJack muss ich sagen dass er mir in seinem ersten Posting einen Ansatz mit Subprocess gegeben hat der tadellos funktioniert :wink:
Egal, ich werde mal die verschiedenen Varianten ausprobieren.

LG
Günther
My hardeware runs better without Windows... ;)
@work Linux Mint Debian , python 2.7 - CentOs 5.6, python 2,7
@home Linux Mint Debian, Open SuSe 12,1 , python 2,7 - MAC OsX Maverick
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. :-)
Antworten