NEW Demo - Process killer
This commit is contained in:
parent
45902d6d5a
commit
db2a5112f0
|
@ -0,0 +1,96 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
import sys
|
||||||
|
import sys
|
||||||
|
if sys.version_info[0] >= 3:
|
||||||
|
import PySimpleGUI as sg
|
||||||
|
else:
|
||||||
|
import PySimpleGUI27 as sg
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import psutil
|
||||||
|
import operator
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def kill_proc_tree(pid, sig=signal.SIGTERM, include_parent=True,
|
||||||
|
timeout=None, on_terminate=None):
|
||||||
|
"""Kill a process tree (including grandchildren) with signal
|
||||||
|
"sig" and return a (gone, still_alive) tuple.
|
||||||
|
"on_terminate", if specified, is a callabck function which is
|
||||||
|
called as soon as a child terminates.
|
||||||
|
"""
|
||||||
|
if pid == os.getpid():
|
||||||
|
raise RuntimeError("I refuse to kill myself")
|
||||||
|
parent = psutil.Process(pid)
|
||||||
|
children = parent.children(recursive=True)
|
||||||
|
if include_parent:
|
||||||
|
children.append(parent)
|
||||||
|
for p in children:
|
||||||
|
p.send_signal(sig)
|
||||||
|
gone, alive = psutil.wait_procs(children, timeout=timeout,
|
||||||
|
callback=on_terminate)
|
||||||
|
return (gone, alive)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# ---------------- Create Form ----------------
|
||||||
|
# sg.ChangeLookAndFeel('Dark')
|
||||||
|
layout = [[sg.Text('Process Killer - Choose one or more processes',
|
||||||
|
size=(45,1), font=('Helvetica', 15))],
|
||||||
|
[sg.Listbox(values=[], size=(50, 30), select_mode=sg.SELECT_MODE_EXTENDED, font=('Courier', 12), key='_processes_')],
|
||||||
|
[sg.Text('Click refresh once or twice.. once for list, second to get CPU usage')],
|
||||||
|
[sg.RButton('Refresh'), sg.RButton('Kill', button_color=('white','red')),
|
||||||
|
sg.Exit(button_color=('white', 'firebrick4'))]]
|
||||||
|
|
||||||
|
window = sg.Window('Process Killer',
|
||||||
|
keep_on_top=True,
|
||||||
|
auto_size_buttons=False,
|
||||||
|
default_button_element_size=(9,1),
|
||||||
|
grab_anywhere=False).Layout(layout)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------- main loop ----------------
|
||||||
|
while (True):
|
||||||
|
# --------- Read and update window --------
|
||||||
|
button, values = window.Read()
|
||||||
|
|
||||||
|
# --------- Do Button Operations --------
|
||||||
|
if values is None or button == 'Exit':
|
||||||
|
break
|
||||||
|
|
||||||
|
if button == 'Refresh':
|
||||||
|
psutil.cpu_percent(interval=1)
|
||||||
|
procs = psutil.process_iter()
|
||||||
|
top = {proc.name(): (proc.cpu_percent(), proc.pid) for proc in procs}
|
||||||
|
|
||||||
|
# cpu_percent = psutil.cpu_percent(interval=interval) # if don't wan to use a task
|
||||||
|
|
||||||
|
display_string = ''
|
||||||
|
# --------- Create list of top % CPU porocesses --------
|
||||||
|
|
||||||
|
top_sorted = sorted(top.items(), key=operator.itemgetter(0), reverse=False)
|
||||||
|
if top_sorted:
|
||||||
|
top_sorted.pop(0)
|
||||||
|
display_string = []
|
||||||
|
for proc, pair in top_sorted:
|
||||||
|
cpu, pid = pair
|
||||||
|
display_string.append('{:5d} {:5.2f} {}\n'.format(pid, cpu/10, proc))
|
||||||
|
|
||||||
|
window.FindElement('_processes_').Update(display_string)
|
||||||
|
|
||||||
|
if button == 'Kill':
|
||||||
|
processes_to_kill = values['_processes_']
|
||||||
|
for proc in processes_to_kill:
|
||||||
|
pid = int(proc[0:5])
|
||||||
|
if sg.PopupYesNo('About to kill {} {}'.format(pid, proc[13:]), keep_on_top=True) == 'Yes':
|
||||||
|
kill_proc_tree(pid=pid)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue