blob: 5ed8f0f66ec141cf66b1a33fada140847e400829 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossum4450bab1994-10-11 14:57:03 +00002
Guido van Rossum502d9601995-09-07 19:59:22 +00003# Tkinter interface to SYSV `ps' and `kill' commands.
Guido van Rossum18886ab1994-07-08 15:08:55 +00004
Benjamin Petersond6d63f52009-01-04 18:53:28 +00005from tkinter import *
Guido van Rossum502d9601995-09-07 19:59:22 +00006
7if TkVersion < 4.0:
Collin Winter6f2df4d2007-07-17 20:59:35 +00008 raise ImportError("This version of svkill requires Tk 4.0 or later")
Guido van Rossum502d9601995-09-07 19:59:22 +00009
Brett Cannona23810f2008-05-26 19:04:21 +000010import subprocess
Guido van Rossum18886ab1994-07-08 15:08:55 +000011import os
12
13user = os.environ['LOGNAME']
14
15class BarButton(Menubutton):
Tim Peters182b5ac2004-07-18 06:16:08 +000016 def __init__(self, master=None, **cnf):
Neal Norwitzd9108552006-03-17 08:00:19 +000017 Menubutton.__init__(self, master, **cnf)
Tim Peters182b5ac2004-07-18 06:16:08 +000018 self.pack(side=LEFT)
19 self.menu = Menu(self, name='menu')
20 self['menu'] = self.menu
Guido van Rossum18886ab1994-07-08 15:08:55 +000021
22class Kill(Frame):
Tim Peters182b5ac2004-07-18 06:16:08 +000023 # List of (name, option, pid_column)
24 view_list = [
25 ('Default', ''),
26 ('Every (-e)', '-e'),
27 ('Non process group leaders (-d)', '-d'),
28 ('Non leaders with tty (-a)', '-a'),
29 ('For this user (-u %s)' % user, '-u %s' % user),
30 ]
31 format_list = [
32 ('Default', '', 0),
33 ('Long (-l)', '-l', 3),
34 ('Full (-f)', '-f', 1),
35 ('Full Long (-f -l)', '-l -f', 3),
36 ('Session and group ID (-j)', '-j', 0),
37 ('Scheduler properties (-c)', '-c', 0),
38 ]
39 def kill(self, selected):
40 c = self.format_list[self.format.get()][2]
Georg Brandl856023a2010-10-25 17:50:20 +000041 pid = selected.split()[c]
Tim Peters182b5ac2004-07-18 06:16:08 +000042 os.system('kill -9 ' + pid)
43 self.do_update()
44 def do_update(self):
45 format = self.format_list[self.format.get()][1]
46 view = self.view_list[self.view.get()][1]
Brett Cannona23810f2008-05-26 19:04:21 +000047 s = subprocess.getoutput('ps %s %s' % (view, format))
Georg Brandl856023a2010-10-25 17:50:20 +000048 list = s.split('\n')
Tim Peters182b5ac2004-07-18 06:16:08 +000049 self.header.set(list[0] + ' ')
50 del list[0]
51 self.frame.list.delete(0, AtEnd())
52 for line in list:
53 self.frame.list.insert(0, line)
54 def do_motion(self, e):
55 e.widget.select_clear('0', 'end')
56 e.widget.select_set(e.widget.nearest(e.y))
57 def do_leave(self, e):
58 e.widget.select_clear('0', 'end')
59 def do_1(self, e):
60 self.kill(e.widget.get(e.widget.nearest(e.y)))
61 def __init__(self, master=None, **cnf):
Neal Norwitzd9108552006-03-17 08:00:19 +000062 Frame.__init__(self, master, **cnf)
Tim Peters182b5ac2004-07-18 06:16:08 +000063 self.pack(expand=1, fill=BOTH)
64 self.bar = Frame(self, name='bar', relief=RAISED,
65 borderwidth=2)
66 self.bar.pack(fill=X)
67 self.bar.file = BarButton(self.bar, text='File')
68 self.bar.file.menu.add_command(
69 label='Quit', command=self.quit)
70 self.bar.view = BarButton(self.bar, text='View')
71 self.bar.format = BarButton(self.bar, text='Format')
72 self.view = IntVar(self)
73 self.view.set(0)
74 self.format = IntVar(self)
75 self.format.set(0)
76 for num in range(len(self.view_list)):
77 label, option = self.view_list[num]
78 self.bar.view.menu.add_radiobutton(
79 label=label,
80 command=self.do_update,
81 variable=self.view,
82 value=num)
83 for num in range(len(self.format_list)):
84 label, option, col = self.format_list[num]
85 self.bar.format.menu.add_radiobutton(
86 label=label,
87 command=self.do_update,
88 variable=self.format,
89 value=num)
90 self.bar.tk_menuBar(self.bar.file,
91 self.bar.view,
92 self.bar.format)
93 self.frame = Frame(self, relief=RAISED, borderwidth=2)
94 self.frame.pack(expand=1, fill=BOTH)
95 self.header = StringVar(self)
96 self.frame.label = Label(
97 self.frame, relief=FLAT, anchor=NW, borderwidth=0,
Tim Peters182b5ac2004-07-18 06:16:08 +000098 textvariable=self.header)
99 self.frame.label.pack(fill=Y, anchor=W)
100 self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
101 self.frame.list = Listbox(
102 self.frame,
103 relief=SUNKEN,
Tim Peters182b5ac2004-07-18 06:16:08 +0000104 width=40, height=10,
105 selectbackground='#eed5b7',
106 selectborderwidth=0,
107 selectmode=BROWSE,
108 yscroll=self.frame.vscroll.set)
109 self.frame.vscroll['command'] = self.frame.list.yview
110 self.frame.vscroll.pack(side=RIGHT, fill=Y)
111 self.frame.list.pack(expand=1, fill=BOTH)
112 self.update = Button(self, text='Update',
113 command=self.do_update)
114 self.update.pack(fill=X)
115 self.frame.list.bind('<Motion>', self.do_motion)
116 self.frame.list.bind('<Leave>', self.do_leave)
117 self.frame.list.bind('<1>', self.do_1)
118 self.do_update()
Guido van Rossum18886ab1994-07-08 15:08:55 +0000119
120if __name__ == '__main__':
Tim Peters182b5ac2004-07-18 06:16:08 +0000121 kill = Kill(None, borderwidth=5)
122 kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
123 kill.winfo_toplevel().minsize(1, 1)
124 kill.mainloop()