epi 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/LICENSE.txt +13 -0
- data/README.md +118 -0
- data/lib/epi/cli.rb +2 -2
- data/lib/epi/cli/commands/help.rb +67 -0
- data/lib/epi/jobs.rb +9 -1
- data/lib/epi/version.rb +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f4c9fe139dc5bf2d4588ee4ee5e2348a634af58
|
4
|
+
data.tar.gz: 6209ed9c345315d1a980d697db4b38dc4595bc98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a988b557f92226f25c0b22d0c212e1d1a3bfa14d4872e367a52a94a480f2bcc420ea70fe170a8d7ab78de9dde7644954b25556b3cb122dc517c22f8420f55ad6
|
7
|
+
data.tar.gz: 2c122327a30c948c96cab15e4b00631d7eb78d66d7cb1e7003665217cf00e1b947d508e61696fff04ee5d696fb9bae57e27abeb151ab0c681c1374d6c3fcfb55
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-m markdown --exclude core_ext
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2014 Neil E. Pearson
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# Epinephrine
|
2
|
+
|
3
|
+
Keeps your workers alive.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```
|
8
|
+
$ gem install epi
|
9
|
+
```
|
10
|
+
|
11
|
+
## Job Configuration
|
12
|
+
|
13
|
+
Example `config.epi`:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
job resque: 'Resque Workers' do |j|
|
17
|
+
j.user = 'webapp'
|
18
|
+
j.directory = File.expand_path('..', __FILE__)
|
19
|
+
j.environment = {
|
20
|
+
QUEUE: '*',
|
21
|
+
TERM_CHILD: 1,
|
22
|
+
PIDFILE: -> p { p.pidfile }
|
23
|
+
}
|
24
|
+
j.command = 'bundle exec rake resque:work'
|
25
|
+
j.initial_processes = 2
|
26
|
+
j.allowed_processes = 1..5
|
27
|
+
j.stdout = nil
|
28
|
+
j.stderr = '/var/log/worker_errors.log'
|
29
|
+
j.kill_timeout = 3.seconds
|
30
|
+
|
31
|
+
j.on(:touch, __FILE__) { |job| job.restart! }
|
32
|
+
j.on(:memory, :gt, 350.megabytes) { |process| process.restart! }
|
33
|
+
j.on(:uptime, :gt, 1.day) { |process| process.restart! }
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
Tell Epi to watch this config file:
|
38
|
+
|
39
|
+
```
|
40
|
+
$ epi config add config.epi
|
41
|
+
Added configuration file: /home/my_app/config.epi
|
42
|
+
```
|
43
|
+
|
44
|
+
## Behaviour
|
45
|
+
|
46
|
+
See what Epi is up to:
|
47
|
+
|
48
|
+
```
|
49
|
+
$ epi status
|
50
|
+
---
|
51
|
+
Running as: root
|
52
|
+
Since: Mon 20 Oct 2014 15:27:04
|
53
|
+
Jobs:
|
54
|
+
Resque Workers [resque]:
|
55
|
+
PID 40210:
|
56
|
+
Since: Mon 20 Oct 2014 15:31:20
|
57
|
+
CPU: 0.0%
|
58
|
+
Memory: 0.3%
|
59
|
+
PID 40213 [dying]:
|
60
|
+
Since: Mon 20 Oct 2014 15:31:21
|
61
|
+
CPU: 0.0%
|
62
|
+
Memory: 0.2%
|
63
|
+
```
|
64
|
+
|
65
|
+
Start/stop workers:
|
66
|
+
|
67
|
+
```
|
68
|
+
$ epi job resque more
|
69
|
+
Increasing 'Resque Workers' processes by 1 (from 2 to 3)
|
70
|
+
$ epi job resque 2 less
|
71
|
+
Decreasing 'Resque Workers' processes by 2 (from 3 to 1)
|
72
|
+
$ epi job resque 4
|
73
|
+
Increasing 'Resque Workers' processes by 3 (from 1 to 4)
|
74
|
+
$ epi job resque pause
|
75
|
+
Decreasing 'Resque Workers' processes by 4 (from 4 to 0)
|
76
|
+
$ epi job resque resume
|
77
|
+
Increasing 'Resque Workers' processes by 4 (from 0 to 4)
|
78
|
+
$ epi job resque max
|
79
|
+
Increasing 'Resque Workers' processes by 1 (from 4 to 5)
|
80
|
+
$ epi job resque restart
|
81
|
+
Replacing 5 'Resque Workers' processes
|
82
|
+
```
|
83
|
+
|
84
|
+
Control the Epi daemon, and all its managed processes:
|
85
|
+
|
86
|
+
```
|
87
|
+
$ epi stop
|
88
|
+
Stopping 5 processes ...
|
89
|
+
Shutting down ...
|
90
|
+
$ epi start
|
91
|
+
Starting 5 processes ...
|
92
|
+
$ epi restart
|
93
|
+
Stopping 5 processes ...
|
94
|
+
Shutting down ...
|
95
|
+
Starting 5 processes ...
|
96
|
+
```
|
97
|
+
|
98
|
+
Config files will be reloaded whenever they change.
|
99
|
+
|
100
|
+
## Polling
|
101
|
+
|
102
|
+
Epi checks the state of running processes every 5 seconds by running the `ps` command.
|
103
|
+
|
104
|
+
Change the number of seconds between polls by setting the `EPI_INTERVAL` environment variable.
|
105
|
+
|
106
|
+
## Logging
|
107
|
+
|
108
|
+
Logs are written to `~/.epi/epi.log`, or `/var/log/epi.log` if run as root.
|
109
|
+
|
110
|
+
Set the `EPI_LOG` environment variable to tell Epi to write logs elsewhere. Set `EPI_LOG_LEVEL` to limit logging to *debug*, *info*, *error*, *warn*, *fatal*, or *unknown*.
|
111
|
+
|
112
|
+
## Running as other users
|
113
|
+
|
114
|
+
You can only configure jobs to run as other users if the Epi daemon runs as root.
|
115
|
+
|
116
|
+
The daemon is started the first time you run the `epi` command, as whatever user ran it. If `epi` is ever run by `root`, the original user's daemon will be replaced by a daemon owned by `root`. Once that's happened, Epi will complain if you try to start or stop the daemon as any other user.
|
117
|
+
|
118
|
+
Epi recognises the history of its daemon running as root by the presence of data in `/etc/epi`. You can force it to use a particular user's data instead by setting the `EPI_HOME` environment variable to, for example, `~/.epi`.
|
data/lib/epi/cli.rb
CHANGED
@@ -6,9 +6,9 @@ module Epi
|
|
6
6
|
class << self
|
7
7
|
|
8
8
|
def run(args)
|
9
|
-
command = args.shift || '
|
9
|
+
command = args.shift || 'help' # The default command
|
10
10
|
begin
|
11
|
-
Command.run command, args
|
11
|
+
Command.run command.delete('-'), args
|
12
12
|
rescue Exceptions::Fatal => error
|
13
13
|
STDERR << error.message
|
14
14
|
STDERR << "\n"
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Epi
|
2
|
+
module Cli
|
3
|
+
module Commands
|
4
|
+
# noinspection RubyStringKeysInHashInspection
|
5
|
+
class Help < Command
|
6
|
+
|
7
|
+
def run
|
8
|
+
puts doc
|
9
|
+
EM.stop
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def doc
|
15
|
+
<<-EOF
|
16
|
+
Epinephrine v#{Epi::VERSION} (c) 2014 Neil E. Pearson
|
17
|
+
Licensed under the Apache License, Version 2.0
|
18
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
19
|
+
See https://github.com/hx/epi for complete documentation
|
20
|
+
|
21
|
+
Usage:
|
22
|
+
#{$0} command [etc...]
|
23
|
+
|
24
|
+
Commands:
|
25
|
+
#{commands}
|
26
|
+
Env vars:
|
27
|
+
EPI_LOG Path to which logs should be written
|
28
|
+
EPI_LOG_LEVEL Logging severity (debug, info, warn, error, fatal)
|
29
|
+
EPI_INTERVAL Delay in seconds between process status checks
|
30
|
+
EPI_HOME Directory in which Epi should store state data
|
31
|
+
EOF
|
32
|
+
end
|
33
|
+
|
34
|
+
def commands
|
35
|
+
all =
|
36
|
+
{
|
37
|
+
'help' => 'Show this screen',
|
38
|
+
|
39
|
+
'config add PATH' => 'Start watching the config file at PATH',
|
40
|
+
'config remove PATH' => 'Stop watching the config file at PATH',
|
41
|
+
|
42
|
+
'job ID NUM' => 'Run NUM instances of ID job',
|
43
|
+
'job ID [more|less]' => 'Run one more/less instances of ID job',
|
44
|
+
'job ID NUM [more|less]' => 'Run NUM more/less instances of ID job',
|
45
|
+
'job ID pause' => 'Stop all instances of ID job',
|
46
|
+
'job ID reset' => 'Run the initial number of ID job instances',
|
47
|
+
'job ID max' => 'Run the maximum allowed number of ID job instances',
|
48
|
+
'job ID min' => 'Run the minimum allowed number of ID job instances',
|
49
|
+
'job ID restart' => 'Replace all instances of ID job with new ones',
|
50
|
+
|
51
|
+
'status' => 'Show details of running/dying instances',
|
52
|
+
|
53
|
+
'start' => 'Start the Epi daemon, and all expected jobs',
|
54
|
+
'stop' => 'Stop the Epi daemon, and all running jobs',
|
55
|
+
'restart' => 'Restart the Epi daemon, and all running jobs'
|
56
|
+
|
57
|
+
}
|
58
|
+
max_key_width = all.keys.map(&:length).max
|
59
|
+
all.map do |cmd, desc|
|
60
|
+
" #{cmd} %s #{desc}\n" % (' ' * (max_key_width - cmd.length))
|
61
|
+
end.join ''
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/epi/jobs.rb
CHANGED
@@ -18,6 +18,14 @@ module Epi
|
|
18
18
|
@by_pid = {}
|
19
19
|
end
|
20
20
|
|
21
|
+
def interval
|
22
|
+
if @interval.nil?
|
23
|
+
@interval = (ENV['EPI_INTERVAL'] || 5).to_f
|
24
|
+
Epi.logger.info "Polling process status every #{@interval} second#{@interval == 1 ? '' : 's'}"
|
25
|
+
end
|
26
|
+
@interval
|
27
|
+
end
|
28
|
+
|
21
29
|
def beat!
|
22
30
|
|
23
31
|
# Cancel any scheduled beats
|
@@ -50,7 +58,7 @@ module Epi
|
|
50
58
|
Data.save
|
51
59
|
|
52
60
|
# Schedule the next beat
|
53
|
-
@next_beat = EventMachine.add_timer(
|
61
|
+
@next_beat = EventMachine.add_timer(interval) { beat! }
|
54
62
|
end
|
55
63
|
|
56
64
|
def shutdown!(&callback)
|
data/lib/epi/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -32,6 +32,9 @@ executables:
|
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
+
- ".yardopts"
|
36
|
+
- LICENSE.txt
|
37
|
+
- README.md
|
35
38
|
- bin/epi
|
36
39
|
- lib/epi.rb
|
37
40
|
- lib/epi/cli.rb
|