Task killen mit Python

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.
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

Moin,

ich bin kompletter Neuling in Python. Ich schreibe hier, weil ich für meinen HTPC ein kleines Script benötige, dass mir einen bestimmten Task killt. Mehr soll es eigentlich auch nicht tun.

Ist so etwas schwierig zu realisieren, weil man noch irgendwelchen Dinge importieren muss oder würde das von Haus aus gehen?


Grüße
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bullrin hat geschrieben:ich bin kompletter Neuling in Python. Ich schreibe hier, weil ich für meinen HTPC ein kleines Script benötige, dass mir einen bestimmten Task killt.
Welches Betriebssystem setzt du ein? Unter Linux reicht ein subprocess.Popen() mit dem kill-Befehl, passende Rechte einmal vorausgesetzt.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Wie wäre es schlicht mit os.kill, allerdings wirst du die Prozess-Id benötigen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

hi,

ich benutze Windows 7 und habe mich gestern noch ein wenig mit Python beschäftigt. Ich habe jetzt ein Python Plugin für Notepad++.
Nach etwas googlen bin ich auf folgenden Code gestoßen:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2008 Jens Kadenbach <j.kadenbach@gmx.de>

# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.

from __future__ import with_statement

import os
import signal
from os import path
from collections import defaultdict

def get_processes():
    for d in os.listdir('/proc'):
        try:
            with open(path.join('/', 'proc', d, 'status'), 'r') as status:
                data = defaultdict(list)
                for line in status:
                    name, value = line.split(':')
                    data[name.lower()].append(value.strip())
                yield map(' '.join, (data['name'], data['pid']))
        except IOError:
            pass

def killall(process_name):
    for pid in (pid for name, pid in get_processes()
        if name == process_name):
            os.kill(int(pid), signal.SIGTERM)
        

if __name__ == '__main__':
    for name, pid in get_processes():
        print name, pid
    killall(raw_input("Prozesse mit folgendem Namen killen: "))

Ich wollte den Code mit n++ dann ausführen, aber irgendwie gab es nur Fehler:
Traceback (most recent call last):
File "C:\Users\Daniel\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\taskk.py", line 37, in <module>
for name, pid in get_processes():
File "C:\Users\Daniel\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\taskk.py", line 19, in get_processes
for d in os.listdir('/proc'):
WindowsError: [Error 3] Das System kann den angegebenen Pfad nicht finden: '/proc/*.*'
Was ist da los? Müsste in der Konsole nicht eine Eingabe erfolgen, welchen Task ich killen möchte?


Grüße
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Rate mal !
Unter Windows gibt es kein Verzeichnis names "/proc", in welchem die Prozesse gelistet sind. Dieser Script funktioniert nur unter unixoiden Betriebsystemen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
lunar

@Xynon1: Genau genommen erst einmal nur unter Linux und möglicherweise ein paar anderen Unix-Derivaten. "/proc/" ist nicht standardisiert.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Habe aber leider keinen Überblick über alle unixoiden Betriebsysteme, mit Sicherheit gibt es auch ein/zwei Linux-Systeme die kein "/proc" benutzen. Aber Danke für den Hinweis, das dies unter nicht Linux-Systemen jedenfalls kein Standard ist/war.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
lunar

@Xynon1: Lies meinen Beitrag nochmal. Ich sagte nicht, dass "/proc/" unter Linux kein Standard wäre. Im Gegenteil, unter Linux ist "/proc/" essentiell, weil einzige Schnittstelle zum Zugriff auf Prozess- und Systeminformationen.

Unter Unix allgemein ist "/proc/" nicht standardisiert. Es gibt viele Unix-Derivate ohne "/proc/", e.g. FreeBSD oder (iirc) HP-UX.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hast du auch alle "nicht"s bei mir gelesen :D
Ich hatte schon verstanden, das "/proc/" in Linux Standard ist. Ich hatte lediglich bemerkt, dass es bestimmt auch irgendeine Linux-Distribution gibt die sich nicht daran hält (zumindest möglich wäre es).
Das "/proc/" unter anderen unixoiden Betriebsystemen nicht der Standardfall ist, hast du ja sehr deutlich gemacht.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

ok, da nützt mir das Script wohl nicht weiter. Kann man es irgendwie umschreiben das es auch in Win7 funzt?
Das Problem ist ja, dass die PID nach jedem Programmstart eine andere ist. Ich hab also nur den Tasknamen bzw. Programmnamen als Anhaltspunkt.

EDIT: lol kein Wunder das script ist aus einem Ubuntu Forum :mrgreen:
lunar

Xynon1 hat geschrieben:Hast du auch alle "nicht"s bei mir gelesen :D
Mit so vielen Verneinung war ich überfordert ;) Sorry ...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

bullrin hat geschrieben:ok, da nützt mir das Script wohl nicht weiter. Kann man es irgendwie umschreiben das es auch in Win7 funzt?
Das Problem ist ja, dass die PID nach jedem Programmstart eine andere ist. Ich hab also nur den Tasknamen bzw. Programmnamen als Anhaltspunkt.
http://lmgtfy.com/?q=python+windows+get+process+id :roll:
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Unter Windows stoppe ich Prozesse mit Taskkill. Hilft das?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Naja, nicht wirklich, AFAIK gibt es den Befehl erst ab Windows 2000 und was wichtiger ist das Problem ist ja nicht das beenden sondern das finden des Prozesses. Natürlich hat man bei "taskkill" die Möglichkeit Namen oder andere Details des Prozesses anzugeben, aber es läuft dennoch darauf das du zur eindeutigen Bennenung des Prozesses die PID benötigt wird.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

bullrin hat geschrieben: ich bin kompletter Neuling in Python.
:roll: sry, aber ich bräuchte etwas genauere Infos bezüglich des Skriptes, da Python nicht wirklich verstehe. Die Syntax sieht etwas verwirrend aus, wenn man Java und C++ gewohnt ist.
Vll könnt ihr mir sagen welche Funktion ich benutzen kann die mir dann die PID liefert. Den Rest mit dem task kill versuch ich dann selbst :)

EDIT: brauche wohl win32pdh. Die ist bei mir nicht vorhanden.
BlackJack

@bullrin: Wenn Du die Syntax nicht verstehst, dann kann man Dir schlecht helfen.

Und wenn Du mal ein wenig in den Suchergebnissen gelesen hättest, währst Du bei dem Treffer bei Stackoverflow.com auf dieses Modul gestossen: http://code.google.com/p/psutil/
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

ok, das sieht schonmal nicht schlecht aus.

Ich könnte mir das Programm so vorstellen.
Ich bekomme die Liste der Prozesse durch

Code: Alles auswählen

 psutil.get_pid_list()
Dann prüfe ich in einer Schleife für jede pid den namen ob er mit dem gesuchten Prozess Namen übereinstimmt.

Code: Alles auswählen

p = psutil.Process(7055)
p.name
Wenn ich die richtige PID gefunden habe kill ich diese mit

Code: Alles auswählen

os.kill(pid)
würde das so funktionieren?
BlackJack

@bullrin: Das könnte sein. Du könntest aber auch die Dokumentation lesen. Man kann auch gleich über die Prozesse iterieren und die Objekte die man da bekommt, haben auch Methoden die nützlich sein könnten.
bullrin
User
Beiträge: 10
Registriert: Samstag 5. Februar 2011, 23:49

ich schätze du meinst

Code: Alles auswählen

psutil.process_iter()
könnt ihr mir nicht noch ein wenig unter die Arme greifen? Ich bekomme das so wahrscheinlich nicht hin. :K
BlackJack

@bullrin: Das meinte ich. Schau Dir halt an was der Iterator für Objekte liefert, welchen Typ die haben, und welche Attribute/Methoden dieser Typ hat.

Falls es immer noch an der Python-Syntax hapert, einfach mal das Tutorial in der Python-Dokumentation durcharbeiten. Mit Java und C++ Vorkenntnissen sollte das grundlegend nicht so schwierig sein.
Antworten