|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- # Kills a process by process name
- #
- # Uses the Performance Data Helper to locate the PID, then kills it.
- # Will only kill the process if there is only one process of that name
- # (eg, attempting to kill "Python.exe" will only work if there is only
- # one Python.exe running. (Note that the current process does not
- # count - ie, if Python.exe is hosting this script, you can still kill
- # another Python.exe (as long as there is only one other Python.exe)
-
- # Really just a demo for the win32pdh(util) module, which allows you
- # to get all sorts of information about a running process and many
- # other aspects of your system.
-
- import sys
-
- import win32api
- import win32con
- import win32pdhutil
-
-
- def killProcName(procname):
- # Change suggested by Dan Knierim, who found that this performed a
- # "refresh", allowing us to kill processes created since this was run
- # for the first time.
- try:
- win32pdhutil.GetPerformanceAttributes("Process", "ID Process", procname)
- except:
- pass
-
- pids = win32pdhutil.FindPerformanceAttributesByName(procname)
-
- # If _my_ pid in there, remove it!
- try:
- pids.remove(win32api.GetCurrentProcessId())
- except ValueError:
- pass
-
- if len(pids) == 0:
- result = "Can't find %s" % procname
- elif len(pids) > 1:
- result = "Found too many %s's - pids=`%s`" % (procname, pids)
- else:
- handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pids[0])
- win32api.TerminateProcess(handle, 0)
- win32api.CloseHandle(handle)
- result = ""
-
- return result
-
-
- if __name__ == "__main__":
- if len(sys.argv) > 1:
- for procname in sys.argv[1:]:
- result = killProcName(procname)
- if result:
- print(result)
- print("Dumping all processes...")
- win32pdhutil.ShowAllProcesses()
- else:
- print("Killed %s" % procname)
- else:
- print("Usage: killProcName.py procname ...")
|