die 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/die +1 -1
- data/die.gemspec +2 -2
- data/lib/die.rb +51 -5
- data/test/test_die.rb +22 -0
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/die
CHANGED
data/die.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{die}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Billy Reisinger"]
|
12
|
-
s.date = %q{2011-11-
|
12
|
+
s.date = %q{2011-11-08}
|
13
13
|
s.default_executable = %q{die}
|
14
14
|
s.description = %q{Kill one or more processes by command name via an interactive script. Die will find processes that match a given command name, and give you the opportunity to kill one, several, all, or none of them.}
|
15
15
|
s.email = %q{billy.reisinger@gmail.com}
|
data/lib/die.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
class Die
|
4
|
+
attr_accessor :signal, :search
|
5
|
+
|
2
6
|
def kill_phash_entry(entry)
|
3
7
|
pid = entry[0].strip.to_i
|
4
|
-
Process.kill(
|
5
|
-
puts "
|
8
|
+
Process.kill(self.signal, pid)
|
9
|
+
puts "#{self.signal} #{pid} #{entry[1]}"
|
6
10
|
end
|
7
11
|
|
8
12
|
def processes
|
9
|
-
@processes ||= `ps -ae -o pid,command |
|
13
|
+
@processes ||= `ps -ae -o pid,command | egrep -i '(#{self.search.join("|")})' | egrep -v \"(#{$0}|grep)\"`.split("\n").map(&:strip)
|
10
14
|
end
|
11
15
|
|
12
16
|
# {
|
@@ -22,14 +26,21 @@ class Die
|
|
22
26
|
p_hash
|
23
27
|
end
|
24
28
|
|
29
|
+
def initialize(opts={})
|
30
|
+
self.signal = (opts[:signal] || "KILL").upcase
|
31
|
+
if !Signal.list.has_key?(self.signal)
|
32
|
+
raise Exception.new "Unknown signal #{self.signal}. Available signals: #{Signal.list.keys.sort.join(", ")}"
|
33
|
+
end
|
34
|
+
self.search = opts[:search] || ""
|
35
|
+
end
|
36
|
+
|
25
37
|
def run
|
26
38
|
unless processes.empty?
|
27
39
|
p_hash = process_hash
|
28
|
-
|
29
40
|
puts
|
30
41
|
puts processes
|
31
42
|
puts
|
32
|
-
puts " Type 'all' to
|
43
|
+
puts " Type 'all' to #{self.signal} 'em all, or the numbers (separated by a space) to kill some. Type anything else to quit."
|
33
44
|
inp = $stdin.gets.strip
|
34
45
|
if(inp =~ /^a(ll)?/i)
|
35
46
|
p_hash.each do |k,v|
|
@@ -44,4 +55,39 @@ class Die
|
|
44
55
|
puts "No processes matching #{ARGV[0]}"
|
45
56
|
end
|
46
57
|
end
|
58
|
+
|
59
|
+
def self.run_from_options
|
60
|
+
opts = {:signal => "KILL", :search => ARGV[0..-1]}
|
61
|
+
o = OptionParser.new do |opt|
|
62
|
+
opt.banner = self.help
|
63
|
+
opt.on("-v", "--version", "Show version") do
|
64
|
+
puts "#{self.to_s} #{File.read(File.join(File.dirname(__FILE__, '..', 'VERSION')))}"
|
65
|
+
exit
|
66
|
+
end
|
67
|
+
opt.on("-s", "--signal SIGNAL", "Signal (defaults to KILL)") do |sig|
|
68
|
+
puts sig, '00' * 100
|
69
|
+
opts[:signal] = sig
|
70
|
+
end
|
71
|
+
end
|
72
|
+
o.parse!
|
73
|
+
self.new(opts).run
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.help
|
77
|
+
<<-STR
|
78
|
+
Description
|
79
|
+
Kill (or send a different signal to) one or more processes by search string.
|
80
|
+
Multiple search strings can be provided, separated by a space.
|
81
|
+
The default signal is KILL; a different one can be provided with the
|
82
|
+
-s switch (see below).
|
83
|
+
|
84
|
+
Usage
|
85
|
+
#{$0} search_string1 [...search_string2 [...]]
|
86
|
+
|
87
|
+
Available signals
|
88
|
+
#{Signal.list.keys.join(", ")}
|
89
|
+
|
90
|
+
Options
|
91
|
+
STR
|
92
|
+
end
|
47
93
|
end
|
data/test/test_die.rb
CHANGED
@@ -54,4 +54,26 @@ class TestDie < Test::Unit::TestCase
|
|
54
54
|
Process.expects(:kill).with("KILL", 249)
|
55
55
|
d.run
|
56
56
|
end
|
57
|
+
|
58
|
+
def test_different_signal
|
59
|
+
d = Die.new(:signal => "ABRT")
|
60
|
+
d.stubs(:processes).returns([
|
61
|
+
"42 /usr/sbin/httpd -D FOREGROUND",
|
62
|
+
"249 /usr/sbin/httpd -D FOREGROUND"
|
63
|
+
])
|
64
|
+
d.stubs(:process_hash).returns({
|
65
|
+
1 => ["42", "/usr/sbin/httpd", "-D", "FOREGROUND"],
|
66
|
+
2 => ["249", "/usr/sbin/httpd", "-D", "FOREGROUND"]
|
67
|
+
})
|
68
|
+
$stdin.stubs(:gets).returns("1 2")
|
69
|
+
Process.expects(:kill).with("ABRT", 42)
|
70
|
+
Process.expects(:kill).with("ABRT", 249)
|
71
|
+
d.run
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_exception_on_unknown_signal
|
75
|
+
assert_raise(Exception) do
|
76
|
+
Die.new(:signal => "DONKEY")
|
77
|
+
end
|
78
|
+
end
|
57
79
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: die
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Billy Reisinger
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-08 00:00:00 -06:00
|
19
19
|
default_executable: die
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|