insidious 0.2 → 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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +64 -2
  3. data/lib/insidious.rb +47 -93
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad7509659f0b9ee6452f114f372f7fe80c9fda90
4
- data.tar.gz: 7d19317732b6409eddcff3bca14161d4df0f30bf
3
+ metadata.gz: 8485070f7631adf42bf17e80f53a3f0d19a4f174
4
+ data.tar.gz: 7f3b4f5e89e271c78288c53a862ff55a22d1bc8f
5
5
  SHA512:
6
- metadata.gz: 71ca90b365af0c14934e9eec46d20333cbc167b4d014dcb8177edd38d239c8f24d22c10832cf0125721f69a0102272650239f6322582b24ffe6528550ca6afd6
7
- data.tar.gz: 07205f48fa03b51f78a7fc208d0f2392b511ad020b1d5268a8a2ced9d662d65726c11780e991c94ebfbfb9057d0cc99194a9fc3d316673410e2536a836483370
6
+ metadata.gz: 9afb4f6f5fa50d56fcd7a43d70b4e3493dbe60feff439f40b9135e9b43052dcf5813b5bcc4458a8d0f11baffa2a66ff81115fe14301c68c33d9f4912f05c1424
7
+ data.tar.gz: e70ee2281b526eb160b3dcc1a4c94fa80321a44163b43fe0505bd73702733cb746f1f2f7ef1bccff90e38ee8f202b1d3fb94478dbd692f5bd0bf8213e524fb7d
data/README.md CHANGED
@@ -3,9 +3,71 @@ Insidious [![Gem Version](http://img.shields.io/gem/v/insidious.svg)](https://ru
3
3
 
4
4
  A simple and flexible ruby gem for managing daemons.
5
5
 
6
- ### Usage
6
+ ### Configuration
7
7
 
8
- Coming soon but for now check out [examples/insidious.rb](https://github.com/jamesrwhite/insidious/blob/master/examples/insidious.rb).
8
+ ````ruby
9
+ insidious = new Insidious(
10
+ :pid_file => '/path/where/the/pid/will/be/saved',
11
+ :daemonize => true, # can be true or false but defaults to being true
12
+ )
13
+ ````
14
+
15
+ ### Start a daemon
16
+
17
+ ````ruby
18
+ insidious = Insidious.new(:pid_file => '/tmp/insidious.pid')
19
+
20
+ insidious.start! do
21
+ while true
22
+ puts Time.now.utc
23
+ sleep 1
24
+ end
25
+ end
26
+ ````
27
+
28
+ ### Stop a daemon
29
+
30
+ ````ruby
31
+ insidious = Insidious.new(:pid_file => '/tmp/insidious.pid')
32
+
33
+ insidious.start! { your_app }
34
+
35
+ insidious.stop!
36
+ ````
37
+
38
+ ### Restart a daemon
39
+
40
+ ````ruby
41
+ insidious = Insidious.new(:pid_file => '/tmp/insidious.pid')
42
+
43
+ insidious.start! { your_app }
44
+
45
+ insidious.restart! { your_app }
46
+ ````
47
+
48
+ ### Check the status of a daemon
49
+
50
+ ````ruby
51
+ insidious = Insidious.new(:pid_file => '/tmp/insidious.pid')
52
+
53
+ insidious.start! { your_app }
54
+
55
+ insidious.running? # => true
56
+
57
+ insidious.stop!
58
+
59
+ insidious.running? # => false
60
+ ````
61
+
62
+ ### Get the process id of a daemon
63
+
64
+ ````ruby
65
+ insidious = Insidious.new(:pid_file => '/tmp/insidious.pid')
66
+
67
+ insidious.start! { your_app }
68
+
69
+ insidious.pid # This will read from /tmp/insidious.pid
70
+ ````
9
71
 
10
72
  ### Credit
11
73
 
@@ -1,43 +1,12 @@
1
1
  require 'error'
2
2
 
3
3
  class Insidious
4
- attr_accessor :pid_file
5
- attr_accessor :pid
6
- attr_accessor :stdin
7
- attr_accessor :stdout
8
- attr_accessor :stderr
4
+ attr_reader :pid_file
9
5
 
6
+ # Intiailise Insidious, note the correct spelling of initialise.
10
7
  def initialize(options = {})
11
8
  @daemonize = options[:daemonize].nil? ? true : options[:daemonize]
12
- @pid_file = options[:pid_file]
13
- @stdin = options[:stdin]
14
- @stdout = options[:stdout]
15
- @stderr = options[:stderr]
16
- end
17
-
18
- # Runs the daemon
19
- #
20
- # This will set up `INT` & `TERM` signal handlers to stop execution
21
- # properly. When this signal handlers are called it will also call
22
- # the #interrupt method and delete the pid file
23
- def run!(&block)
24
- begin
25
- if @daemonize
26
- Process.daemon(true, (stdin || stdout || stderr))
27
- end
28
-
29
- save_pid_file
30
-
31
- block.call
32
- rescue Interrupt, SignalException
33
- interrupt
34
- end
35
- end
36
-
37
- # Handles an interrupt (`SIGINT` or `SIGTERM`) properly as it
38
- # deletes the pid file and calles the `stop` method.
39
- def interrupt
40
- File.delete(pid_file) if pid_file && File.exists?(pid_file)
9
+ @pid_file = options[:pid_file].nil? ? nil : File.absolute_path(options[:pid_file])
41
10
  end
42
11
 
43
12
  # Starts the daemon
@@ -51,12 +20,12 @@ class Insidious
51
20
  fail InsidiousError.new("Process is already running with PID #{pid}")
52
21
  exit 2
53
22
  else
54
- if pid_file.nil? && daemonize
23
+ if @pid_file.nil? && daemon?
55
24
  fail InsidiousError.new('No PID file is set but daemonize is set to true')
56
25
  exit 1
57
26
  end
58
27
 
59
- run!(&block)
28
+ run_daemon!(&block)
60
29
  end
61
30
  end
62
31
 
@@ -65,41 +34,35 @@ class Insidious
65
34
  # This method only works when a PID file is given, otherwise it will
66
35
  # exit with an error.
67
36
  def stop!
68
- if pid_file && File.exists?(pid_file)
37
+ if @pid_file && File.exists?(@pid_file)
69
38
  begin
70
39
  Process.kill(:INT, pid)
71
- File.delete(pid_file)
40
+ File.delete(@pid_file)
72
41
  rescue Errno::ESRCH
73
42
  fail InsidiousError.new("No process is running with PID #{pid}")
74
43
  exit 3
75
44
  end
76
45
  else
77
- fail InsidiousError.new("Couldn't find the PID file: '#{pid_file}'")
46
+ fail InsidiousError.new("Couldn't find the PID file: '#{@pid_file}'")
78
47
  exit 1
79
48
  end
80
49
  end
81
50
 
82
- # Restarts the daemon
51
+ # Restarts the daemon, just a convenience method really
83
52
  def restart!(&block)
84
- if running?
85
- stop!
86
- end
87
-
53
+ stop! if running?
88
54
  start!(&block)
89
55
  end
90
56
 
91
- # Get the pid from the pid_file
92
- def pid
93
- File.read(@pid_file).strip.to_i
94
- end
95
-
96
- # Returns `true` if the daemon is running
57
+ # Returns true if the daemon is running
97
58
  def running?
98
59
  # First check if we have a pid file and if it exists
99
- if pid_file.nil? || !File.exists?(pid_file)
100
- return false
101
- end
60
+ return false if @pid_file.nil? || !File.exists?(@pid_file)
61
+
62
+ # Then make sure we have a pid
63
+ return false if pid.nil?
102
64
 
65
+ # If we can get the process id then we assume it is running
103
66
  begin
104
67
  Process.getpgid(pid)
105
68
  true
@@ -113,54 +76,45 @@ class Insidious
113
76
  @daemonize
114
77
  end
115
78
 
116
- # Changes the working directory
117
- #
118
- # All paths will be relative to the working directory unless they're
119
- # specified as absolute paths.
120
- #
121
- # @param [String] path of the new workng directory
122
- def chdir!(path)
123
- Dir.chdir(File.absolute_path(path))
79
+ # Get the pid from the pid_file
80
+ # TODO: should this be 'cached'?
81
+ def pid
82
+ File.read(@pid_file).strip.to_i
124
83
  end
125
84
 
126
- # Set the path where the PID file will be created
127
- def pid_file=(path)
128
- @pid_file = File.absolute_path(path)
85
+ # Save the PID to the PID file specified in @pid_file
86
+ def pid=(pid)
87
+ File.open(@pid_file, 'w') do |file|
88
+ file.write(pid)
89
+ end if @pid_file
129
90
  end
130
91
 
131
- # Reopens `STDIN` for reading from `path`
132
- #
133
- # This path is relative to the working directory unless an absolute
134
- # path is given.
135
- def stdin=(path)
136
- @stdin = File.absolute_path(path)
137
- STDIN.reopen(@stdin)
138
- end
92
+ private
139
93
 
140
- # Reopens `STDOUT` for writing to `path`
94
+ # Runs the daemon
141
95
  #
142
- # This path is relative to the working directory unless an absolute
143
- # path is given.
144
- def stdout=(path)
145
- @stdout = File.absolute_path(path)
146
- STDOUT.reopen(@stdout, 'a')
147
- end
96
+ # This will set up `INT` & `TERM` signal handlers to stop execution
97
+ # properly. When this signal handlers are called it will also call
98
+ # the #interrupt method and delete the pid file
99
+ def run_daemon!(&block)
100
+ begin
101
+ # Only start the process as a daemon if requested
102
+ Process.daemon(true) if daemon?
148
103
 
149
- # Reopens `STDERR` for writing to `path`
150
- #
151
- # This path is relative to the working directory unless an absolute
152
- # path is given.
153
- def stderr=(path)
154
- @stderr = File.absolute_path(path)
155
- STDERR.reopen(stderr, 'a')
156
- end
104
+ # Set the process id, this will save it to @pid_file
105
+ self.pid = Process.pid
157
106
 
158
- private
107
+ # Call the block of code passed to us
108
+ block.call
109
+ # Handle interruptipns such as someone ctrl-c or killing the process
110
+ rescue Interrupt, SignalException
111
+ interrupt!
112
+ end
113
+ end
159
114
 
160
- # Save the falen angel PID to the PID file specified in `pid_file`
161
- def save_pid_file
162
- File.open(pid_file, 'w') do |fp|
163
- fp.write(Process.pid)
164
- end if pid_file
115
+ # Handle an interrupt (`SIGINT` or `SIGTERM`) by deleting the
116
+ # pid file if it exists
117
+ def interrupt!
118
+ File.delete(@pid_file) if @pid_file && File.exists?(@pid_file)
165
119
  end
166
120
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insidious
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - James White
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-05 00:00:00.000000000 Z
11
+ date: 2014-04-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -32,12 +32,12 @@ require_paths:
32
32
  - lib
33
33
  required_ruby_version: !ruby/object:Gem::Requirement
34
34
  requirements:
35
- - - ">="
35
+ - - '>='
36
36
  - !ruby/object:Gem::Version
37
37
  version: 1.9.3
38
38
  required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ">="
40
+ - - '>='
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  requirements: []