spoon_daemon 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -24,10 +24,9 @@ Or install it yourself as:
24
24
  SpoonDaemon::Runner.new('path/to/my/script.rb', cmd, options)
25
25
  ```
26
26
 
27
- Where cmd is 'start', 'stop' or 'restart'
28
-
29
- And options are:
30
- * `pid_dir`: where to create the PID file
27
+ Where cmd is one of `start`, `stop` or `restart`, and options are:
28
+ * `:pid_dir`: where to create the PID file
29
+ * `:name`: process name, used for the PID filename
31
30
 
32
31
 
33
32
  ## Contributing
data/lib/spoon_daemon.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "spoon"
2
+ require "timeout"
2
3
 
3
4
  require "spoon_daemon/version"
4
5
 
@@ -9,8 +10,10 @@ module SpoonDaemon
9
10
 
10
11
  @pid_dir = options[:pid_dir] || '.'
11
12
  @name = options[:name] || File.basename(script)
13
+ @timeout = options[:timeout] || 10
12
14
 
13
15
  @pid_path = File.join(@pid_dir, "#{@name}.pid")
16
+ @pid = get_pid
14
17
 
15
18
  case cmd
16
19
  when 'start'
@@ -51,29 +54,38 @@ module SpoonDaemon
51
54
  def remove_pidfile
52
55
  File.unlink(@pid_path)
53
56
  rescue => e
54
- STDERR.puts "ERROR: Unable to unlink #{path}:\n\t" +
57
+ STDERR.puts "ERROR: Unable to unlink #{@pid_path}:\n\t" +
55
58
  "(#{e.class}) #{e.message}"
56
59
  exit
57
60
  end
58
61
 
59
62
  def process_exists?
60
- pid = get_pid
61
- return false unless pid
62
- Process.kill(0, pid)
63
+ return false unless @pid
64
+ Process.kill(0, @pid)
63
65
  true
64
66
  rescue Errno::ESRCH, TypeError # "PID is NOT running or is zombied
65
67
  false
66
68
  rescue Errno::EPERM
67
- STDERR.puts "No permission to query #{pid}!";
69
+ STDERR.puts "No permission to query #{@pid}!";
68
70
  false
69
71
  end
70
72
 
71
73
  def stop
72
- pid = get_pid
73
- Process.kill("TERM", pid)
74
+ abort "No process running, nothing to stop" unless process_exists?
75
+
76
+ begin
77
+ STDOUT.puts "Stopping process #{@pid}..."
78
+ Timeout.timeout(@timeout) do
79
+ Process.kill("TERM", @pid)
80
+ sleep 1 while process_exists?
81
+ end
82
+ rescue Timeout::Error
83
+ STDERR.puts "Graceful shutdown timeout, sending KILL signal"
84
+ Process.kill("KILL", @pid)
85
+ end
86
+
74
87
  remove_pidfile
75
- rescue Errno::ESRCH
76
- abort "No process to kill"
88
+ STDOUT.puts "Process stopped."
77
89
  end
78
90
 
79
91
  def start
@@ -1,3 +1,3 @@
1
1
  module SpoonDaemon
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: spoon_daemon
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Emilien Taque
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-12-26 00:00:00 Z
13
+ date: 2012-12-28 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: spoon