Webbrowser schließen mit python

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
__blackjack__
User
Beiträge: 8104
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 11. Januar 2021, 16:00

@joernius: Umständlich und je nach Programmname und was da so läuft auch gefährlich kaputt. Je kürzer der Programmname desto wahrscheinlicher das als Kollateralschaden noch ganz andere Prozesse beendet werden. Sollte der Programmname zufällig im Namen des Benutzers enthalten sein, dann werden sogar *alle* Prozesse von dem Benutzer beendet.

Das Problem ist durch `driver.close()` je bereits einfach und sicher gelöst. Aber falls man wirklich selbst nach dem Namen beenden will, dann gibt es das bereits erwähnte `psutil`-Modul

Code: Alles auswählen

#!/usr/bin/env python3
from signal import SIGKILL, SIGTERM

import psutil


def send_signal(processes, signal):
    for process in processes:
        try:
            process.send_signal(signal)
        except psutil.NoSuchProcess:
            pass


def main():
    processes = [
        process
        for process in psutil.process_iter()
        if process.name() == "firefox"
    ]
    send_signal(processes, SIGTERM)
    _, still_alive = psutil.wait_procs(processes, 3)
    send_signal(still_alive, SIGKILL)


if __name__ == "__main__":
    main()
“Unfortunately forty years of programming experience has taught me that there's an essentially infinite supply of mistakes to make … your mistakes just get smarter most of the time.” — Steve Holden
nezzcarth
User
Beiträge: 1235
Registriert: Samstag 16. April 2011, 12:47

Montag 11. Januar 2021, 18:09

Hinzu kommt, dass man ps nur selten in Kombination mit grep braucht, denn dafür gibt es pgrep oder pidof, sowie weiterhin pkill, das auf Basis von Namensbestandteilen operiert. Die gezeigte Pipeline ist äquivalent zu pkill -f <prozessname>. Ich würde das aber wie ja schon mehrfach gesagt wurde gar nicht so machen.
Antworten