Seite 1 von 1

Problem mit subprocess

Verfasst: Mittwoch 26. Februar 2014, 10:25
von gobo38
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

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 ! :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

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. 8)

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

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