Prozess läuft nicht, obwohl er läuft

  • Ich habe dieses kleine Pythonscript, das die Auslastung der CPU überprüft und überprüfen soll, ob ein Prozess, in dem Fall sox läuft:

    Trotzdem sagt er mir immer, Prozess läuft nicht:

    Code
    40 ist über 20
    Prozess läuft nicht
    sox
    Prozess läuft nicht
    sox
    Prozess läuft nicht
    sox
    Prozess läuft nicht
    sox

    Wo habe ich da schon wieder den Denkfehler ? :denker:

  • Ja, auf einem anderen Teminal läuft läuft nebenher noch top. :lol:

    top ist gut, aber schau in einem weiteren Terminal auch mit z. B.:

    Code
    ps -fC sox && pidof sox

    nach.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo,

    also unter Ubuntu 20.04 auf einem E550 Laptop funktioniert das:

    Python
    >>> import psutil
    >>> PROCNAME = 'sox'
    >>> for proc in psutil.process_iter():
    ...     if proc.name()==PROCNAME:
    ...         print(proc)
    ... 
    psutil.Process(pid=4060, name='sox', started='11:00:03')
    >>>

    sox habe ich in einem 2. Terminal in einer "Warteschleife testweise gestartet, mit dem Befehl sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav (der Befehl macht nix, weil sox von stdin lesen will).

    Gruß, noisefloor

  • Ich habe das bei mir gerade mal versucht, wenn ich

    Code
    for proc in psutil.process_iter():
        print(proc.name())

    ausführe, dann erhalte ich keine 'print'-Ausgabe. Wenn ich das ersetze durch

    Code
     for proc in psutil.process_iter(['name']):
         print(proc.info)

    Dann erhalte ich eine 'print'-Ausgabe mit Prozessen, die bei mir laufen. Vielleicht kannst du auf diesem Ansatz aufbauen.

    https://psutil.readthedocs.io/en/latest/#processes


    Edit: Hier war ja ganz schön was los, in der Zeit die ich zum schreiben gebraucht habe :huh:

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Wenn die 'if' Bedingung für den ersten Prozess nicht erfüllt ist, dann greift dein 'else' und das für jeden Prozess, bis der 'sox' kommt oder eben alle durch sind.

    Edit: Schreib doch alle Prozesse in eine Listen-Form und suche dann ob sich 'sox' darin befindet und dann gibts eine 'if'-Abfrage.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Kapiere ich nicht, er dürfte doch durch das if und PROCNAME gar nicht dort hingelangen.

    Wie Dennis89 richtig erklärt hat: Du gehst alle Prozesse durch (Zeilen 14 u. 27). Für jeden Prozess prüfst Du dann, ob sein Name "sox" ist (Zeilen 15 u. 28). Du gibst also für jeden Prozess, der nicht "sox" heißt, Dein "Prozess läuft nicht" aus und pausierst dann eine Sekunde. Nur für den einen(?) Prozess, der tatsächlich "sox" heißt, läufst Du dann in den "läuft"-Zweig Deiner if-Abfrage.

  • Ich habe es auch mal hier mit getestet und es funktioniert.

    Der Funktion proc_iter kann man auch Attribute in einer Liste übergeben.

    Diese werden dann in dem Objekt als dict gesichert. Das Attribut heißt info.

    Ich habe dann im Hintergund sox laufen lassen und bekomme dann das hier:

    Der Name eines Prozesses wird normalerweise von dem Namen des ausführbaren Programms vererbt.

    Prozesse können ihren Namen aber auch nachträglich ändern. Mit Python geht das auch: setproctitle.

    Solange du aber sox in top/htop sehen kannst, muss process_iter diesen Prozess auch finden.

    Ich kann mir nicht vorstellen, dass in dem Namen noch irgendwelche Leerzeichen sind.

    Übrigens ist es einfacher Funktionen zu testen.

    Du verwendest zwei mal den gleichen Code. Daraus habe ich eine Funktion gemacht und die kann man auch besser testen.

    Vor allem kann man diese Funktion testen, ohne das restliche Programm auszuführen.

    Siehe if __name__ == "__main__":

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!