daemons 1.1.9 → 1.2.1
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.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/README.md +206 -0
- data/Releases +17 -0
- data/examples/call/call.rb +13 -16
- data/examples/call/call_monitor.rb +13 -17
- data/examples/daemonize/daemonize.rb +4 -8
- data/examples/run/ctrl_crash.rb +0 -1
- data/examples/run/ctrl_custom_logfiles.rb +18 -0
- data/examples/run/ctrl_exec.rb +0 -1
- data/examples/run/ctrl_exit.rb +0 -1
- data/examples/run/ctrl_keep_pid_files.rb +1 -3
- data/examples/run/ctrl_monitor.rb +0 -1
- data/examples/run/ctrl_monitor_multiple.rb +17 -0
- data/examples/run/ctrl_multiple.rb +0 -1
- data/examples/run/ctrl_ontop.rb +0 -1
- data/examples/run/ctrl_optionparser.rb +4 -6
- data/examples/run/ctrl_proc.rb +8 -9
- data/examples/run/ctrl_proc_multiple.rb +4 -6
- data/examples/run/ctrl_proc_rand.rb +2 -4
- data/examples/run/ctrl_proc_simple.rb +0 -1
- data/examples/run/myserver.rb +0 -1
- data/examples/run/myserver_crashing.rb +5 -5
- data/examples/run/myserver_exiting.rb +2 -2
- data/examples/run/myserver_hanging.rb +4 -5
- data/examples/run/myserver_slowstop.rb +5 -6
- data/lib/daemons.rb +66 -68
- data/lib/daemons/application.rb +171 -188
- data/lib/daemons/application_group.rb +99 -92
- data/lib/daemons/change_privilege.rb +3 -3
- data/lib/daemons/cmdline.rb +43 -54
- data/lib/daemons/controller.rb +36 -53
- data/lib/daemons/daemonize.rb +54 -64
- data/lib/daemons/etc_extension.rb +3 -2
- data/lib/daemons/exceptions.rb +10 -11
- data/lib/daemons/monitor.rb +60 -62
- data/lib/daemons/pid.rb +24 -56
- data/lib/daemons/pidfile.rb +38 -40
- data/lib/daemons/pidmem.rb +5 -9
- data/lib/daemons/version.rb +3 -0
- metadata +45 -45
- data/README +0 -214
- data/Rakefile +0 -90
- data/TODO +0 -2
- data/setup.rb +0 -1360
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e59f2e1546ffdb0c31f593a15204e5a027e64392
|
4
|
+
data.tar.gz: da329109adb90ff065d7ae0e7dd6b0238d83862d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9e80ab5277dd3607978f6f5ccb23c95088f4dcaec7ecee4059a7649d071bc0c4451f6ece2f415c6900182a19b2e6abd5c8502b59876faa6cac66ec3eefee9eca
|
7
|
+
data.tar.gz: 0ce93e84a5ef74e07593193bcff94fec8d48687d0e9f976a2d289139ab7c74eb75c9e71811f696a5135eecc8836392ec56b95207982449ad8cd2ed8e19c89376
|
data/LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
Ruby Daemons
|
2
|
+
============
|
3
|
+
|
4
|
+
Daemons provides an easy way to wrap existing ruby scripts (for example a self-written server)
|
5
|
+
to be _run as a daemon_ and to be _controlled by simple start/stop/restart commands_.
|
6
|
+
|
7
|
+
If you want, you can also use daemons to _run blocks of ruby code in a daemon process_ and to control
|
8
|
+
these processes from the main application.
|
9
|
+
|
10
|
+
Besides this basic functionality, daemons offers many advanced features like _exception backtracing_
|
11
|
+
and logging (in case your ruby script crashes) and _monitoring_ and automatic restarting of your processes
|
12
|
+
if they crash.
|
13
|
+
|
14
|
+
Basic Usage
|
15
|
+
-----------
|
16
|
+
|
17
|
+
You can use Daemons in four different ways:
|
18
|
+
|
19
|
+
### 1. Create wrapper scripts for your server scripts or applications
|
20
|
+
|
21
|
+
Layout: suppose you have your self-written server `myserver.rb`:
|
22
|
+
|
23
|
+
``` ruby
|
24
|
+
# this is myserver.rb
|
25
|
+
# it does nothing really useful at the moment
|
26
|
+
|
27
|
+
loop do
|
28
|
+
sleep(5)
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
To use `myserver.rb` in a production environment, you need to be able to
|
33
|
+
run `myserver.rb` in the _background_ (this means detach it from the console, fork it
|
34
|
+
in the background, release all directories and file descriptors).
|
35
|
+
|
36
|
+
Just create `myserver_control.rb` like this:
|
37
|
+
|
38
|
+
``` ruby
|
39
|
+
# this is myserver_control.rb
|
40
|
+
require 'daemons'
|
41
|
+
|
42
|
+
Daemons.run('myserver.rb')
|
43
|
+
```
|
44
|
+
|
45
|
+
And use it like this from the console:
|
46
|
+
|
47
|
+
``` ruby
|
48
|
+
$ ruby myserver_control.rb start
|
49
|
+
(myserver.rb is now running in the background)
|
50
|
+
$ ruby myserver_control.rb restart
|
51
|
+
(...)
|
52
|
+
$ ruby myserver_control.rb stop
|
53
|
+
```
|
54
|
+
|
55
|
+
For testing purposes you can even run `myserver.rb` _without forking_ in the background:
|
56
|
+
|
57
|
+
``` ruby
|
58
|
+
$ ruby myserver_control.rb run
|
59
|
+
```
|
60
|
+
|
61
|
+
An additional nice feature of Daemons is that you can pass _additional arguments_ to the script that
|
62
|
+
should be daemonized by seperating them by two _hyphens_:
|
63
|
+
|
64
|
+
``` ruby
|
65
|
+
$ ruby myserver_control.rb start -- --file=anyfile --a_switch another_argument
|
66
|
+
```
|
67
|
+
|
68
|
+
|
69
|
+
### 2. Create wrapper scripts that include your server procs
|
70
|
+
|
71
|
+
Layout: suppose you have some code you want to run in the background and control that background process
|
72
|
+
from a script:
|
73
|
+
|
74
|
+
``` ruby
|
75
|
+
# this is your code
|
76
|
+
# it does nothing really useful at the moment
|
77
|
+
|
78
|
+
loop do
|
79
|
+
sleep(5)
|
80
|
+
end
|
81
|
+
```
|
82
|
+
|
83
|
+
To run this code as a daemon create `myproc_control.rb` like this and include your code:
|
84
|
+
|
85
|
+
``` ruby
|
86
|
+
# this is myproc_control.rb
|
87
|
+
require 'daemons'
|
88
|
+
|
89
|
+
Daemons.run_proc('myproc.rb') do
|
90
|
+
loop do
|
91
|
+
sleep(5)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
96
|
+
And use it like this from the console:
|
97
|
+
|
98
|
+
``` ruby
|
99
|
+
$ ruby myproc_control.rb start
|
100
|
+
(myproc.rb is now running in the background)
|
101
|
+
$ ruby myproc_control.rb restart
|
102
|
+
(...)
|
103
|
+
$ ruby myproc_control.rb stop
|
104
|
+
```
|
105
|
+
|
106
|
+
For testing purposes you can even run `myproc.rb` _without forking_ in the background:
|
107
|
+
|
108
|
+
``` ruby
|
109
|
+
$ ruby myproc_control.rb run
|
110
|
+
```
|
111
|
+
|
112
|
+
### 3. Control a bunch of daemons from another application
|
113
|
+
|
114
|
+
Layout: you have an application `my_app.rb` that wants to run a bunch of
|
115
|
+
server tasks as daemon processes.
|
116
|
+
|
117
|
+
``` ruby
|
118
|
+
# this is my_app.rb
|
119
|
+
require 'daemons'
|
120
|
+
|
121
|
+
task1 = Daemons.call(:multiple => true) do
|
122
|
+
# first server task
|
123
|
+
|
124
|
+
loop do
|
125
|
+
conn = accept_conn()
|
126
|
+
serve(conn)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
task2 = Daemons.call do
|
131
|
+
# second server task
|
132
|
+
|
133
|
+
loop do
|
134
|
+
something_different()
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# the parent process continues to run
|
139
|
+
|
140
|
+
# we can even control our tasks, for example stop them
|
141
|
+
task1.stop
|
142
|
+
task2.stop
|
143
|
+
|
144
|
+
exit
|
145
|
+
```
|
146
|
+
|
147
|
+
### 4. Daemonize the currently running process
|
148
|
+
|
149
|
+
Layout: you have an application `my_daemon.rb` that wants to run as a daemon
|
150
|
+
(but without the ability to be controlled by daemons via start/stop commands)
|
151
|
+
|
152
|
+
``` ruby
|
153
|
+
# this is my_daemons.rb
|
154
|
+
require 'daemons'
|
155
|
+
|
156
|
+
# Initialize the app while we're not a daemon
|
157
|
+
init()
|
158
|
+
|
159
|
+
# Become a daemon
|
160
|
+
Daemons.daemonize
|
161
|
+
|
162
|
+
# The server loop
|
163
|
+
loop do
|
164
|
+
conn = accept_conn()
|
165
|
+
serve(conn)
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
For further documentation, refer to the module documentation of Daemons.
|
170
|
+
|
171
|
+
Displaying daemon status
|
172
|
+
------------------------
|
173
|
+
|
174
|
+
When daemonizing a process using a wrapper script, as examples 1 and 2 above,
|
175
|
+
the status can be shown using
|
176
|
+
|
177
|
+
``` ruby
|
178
|
+
$ ruby myproc_control.rb status
|
179
|
+
```
|
180
|
+
|
181
|
+
By default this will display whether or not the daemon is running and, if it
|
182
|
+
is, its PID.
|
183
|
+
|
184
|
+
A custom message can be shown with
|
185
|
+
|
186
|
+
``` ruby
|
187
|
+
def custom_show_status(app)
|
188
|
+
# Display the default status information
|
189
|
+
app.default_show_status
|
190
|
+
|
191
|
+
puts
|
192
|
+
puts "PS information"
|
193
|
+
system("ps -p #{app.pid.pid.to_s}")
|
194
|
+
|
195
|
+
puts
|
196
|
+
puts "Size of log files"
|
197
|
+
system("du -hs /path/to/logs")
|
198
|
+
end
|
199
|
+
|
200
|
+
Daemons.run('myserver.rb', { show_status_callback: :custom_show_status })
|
201
|
+
```
|
202
|
+
|
203
|
+
Author
|
204
|
+
------
|
205
|
+
|
206
|
+
Written 2005-2015 by Thomas Uehlinger <thomas.uehlinger@gmail.com>, 2014-2015 by Aaron Stone <aaron@serendipity.cx>.
|
data/Releases
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
= Daemons Release History
|
2
2
|
|
3
|
+
== Release 1.2.1: March 10, 2015
|
4
|
+
|
5
|
+
* increase version number to be able to re-push to rubygems
|
6
|
+
|
7
|
+
== Release 1.2.0: March 8, 2015
|
8
|
+
|
9
|
+
* add options for custum log file names.
|
10
|
+
* change pid file name scheme to "#progname_num#{number}.pid" for multiple instances.
|
11
|
+
* fix call_as_daemon not saving the PID (thanks Roberto Plancarte)
|
12
|
+
* allow for custom statis messages (thanks to Joseph Haig)
|
13
|
+
* fix Pid.running? rescuing timeout exceptions (thanks to Geraud Boyer)
|
14
|
+
* monitor.rb/application.rb/application_group.rb: handle :monitor and :multiple in combination correctly
|
15
|
+
(thanks to Prakash Murthy).
|
16
|
+
* pidfile.rb: Handle invalid or empty pid files instead of returning pid 0 (thanks to Aaron Stone)
|
17
|
+
* run the whole gem through Rubocop (thanks to Aaron Stone)
|
18
|
+
* gem cleanup (thanks to Aaron Stone)
|
19
|
+
|
3
20
|
== Release 1.1.9: August 10, 2012
|
4
21
|
|
5
22
|
* daemonize.rb: do srand in the forked child process both in daemonize and call_as_daemon
|
data/examples/call/call.rb
CHANGED
@@ -6,12 +6,10 @@ else
|
|
6
6
|
begin; require 'rubygems'; rescue ::Exception; end
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
9
|
require 'daemons'
|
11
10
|
|
12
11
|
testfile = File.expand_path(__FILE__) + '.log'
|
13
12
|
|
14
|
-
|
15
13
|
# On the first call to <tt<call</tt>, an application group (accessible by <tt>Daemons.group</tt>)
|
16
14
|
# will be created an the options will be kept within, so you only have to specify
|
17
15
|
# <tt>:multiple</tt> once.
|
@@ -23,35 +21,34 @@ options = {
|
|
23
21
|
:multiple => true
|
24
22
|
}
|
25
23
|
|
26
|
-
|
27
24
|
Daemons.call(options) do
|
28
|
-
File.open(testfile, 'w')
|
29
|
-
f.puts
|
30
|
-
|
25
|
+
File.open(testfile, 'w') do |f|
|
26
|
+
f.puts 'test'
|
27
|
+
end
|
31
28
|
|
32
|
-
loop { puts
|
29
|
+
loop { puts '1'; sleep 5 }
|
33
30
|
end
|
34
|
-
puts
|
31
|
+
puts 'first task started'
|
35
32
|
|
36
33
|
Daemons.call do
|
37
|
-
loop { puts
|
34
|
+
loop { puts '2'; sleep 4 }
|
38
35
|
end
|
39
|
-
puts
|
36
|
+
puts 'second task started'
|
40
37
|
|
41
38
|
# NOTE: this process will exit after 5 seconds
|
42
39
|
Daemons.call do
|
43
|
-
puts
|
40
|
+
puts '3'
|
44
41
|
sleep 5
|
45
42
|
end
|
46
|
-
puts
|
43
|
+
puts 'third task started'
|
47
44
|
|
48
|
-
puts
|
45
|
+
puts 'waiting 20 seconds...'
|
49
46
|
sleep(20)
|
50
47
|
|
51
|
-
# This call would result in an exception as it will try to kill the third process
|
48
|
+
# This call would result in an exception as it will try to kill the third process
|
52
49
|
# which has already terminated by that time; but using the 'true' parameter forces the
|
53
50
|
# stop_all procedure.
|
54
|
-
puts
|
51
|
+
puts 'trying to stop all tasks...'
|
55
52
|
Daemons.group.stop_all(true)
|
56
53
|
|
57
|
-
puts
|
54
|
+
puts 'done'
|
@@ -6,12 +6,10 @@ else
|
|
6
6
|
begin; require 'rubygems'; rescue ::Exception; end
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
9
|
require 'daemons'
|
11
10
|
|
12
11
|
testfile = File.expand_path(__FILE__) + '.log'
|
13
12
|
|
14
|
-
|
15
13
|
# On the first call to <tt<call</tt>, an application group (accessible by <tt>Daemons.group</tt>)
|
16
14
|
# will be created an the options will be kept within, so you only have to specify
|
17
15
|
# <tt>:multiple</tt> once.
|
@@ -23,33 +21,31 @@ options = {
|
|
23
21
|
:monitor => true
|
24
22
|
}
|
25
23
|
|
26
|
-
|
27
24
|
Daemons.call(options) do
|
28
|
-
loop { puts
|
25
|
+
loop { puts '1'; sleep 20 }
|
29
26
|
end
|
30
|
-
puts
|
31
|
-
|
27
|
+
puts 'first task started'
|
32
28
|
|
33
29
|
# NOTE: this process will exit after 5 seconds
|
34
30
|
Daemons.call do
|
35
|
-
File.open(testfile, 'a')
|
36
|
-
f.puts
|
37
|
-
puts
|
38
|
-
|
31
|
+
File.open(testfile, 'a') do |f|
|
32
|
+
f.puts 'started...'
|
33
|
+
puts '2'
|
34
|
+
|
39
35
|
sleep 5
|
40
36
|
|
41
|
-
f.puts
|
42
|
-
|
37
|
+
f.puts '...exit'
|
38
|
+
end
|
43
39
|
end
|
44
|
-
puts
|
40
|
+
puts 'second task started'
|
45
41
|
|
46
|
-
puts
|
42
|
+
puts 'waiting 100 seconds...'
|
47
43
|
sleep(100)
|
48
44
|
|
49
|
-
# This call would result in an exception as it will try to kill the third process
|
45
|
+
# This call would result in an exception as it will try to kill the third process
|
50
46
|
# which has already terminated by that time; but using the 'true' parameter forces the
|
51
47
|
# stop_all procedure.
|
52
|
-
puts
|
48
|
+
puts 'trying to stop all tasks...'
|
53
49
|
Daemons.group.stop_all(true)
|
54
50
|
|
55
|
-
puts
|
51
|
+
puts 'done'
|
@@ -6,22 +6,18 @@ else
|
|
6
6
|
begin; require 'rubygems'; rescue ::Exception; end
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
9
|
require 'daemons'
|
12
10
|
|
13
|
-
|
14
11
|
options = {
|
15
12
|
:log_output => true
|
16
13
|
}
|
17
14
|
|
18
|
-
|
19
15
|
testfile = File.expand_path(__FILE__) + '.txt'
|
20
16
|
|
21
17
|
Daemons.daemonize(options)
|
22
18
|
|
23
|
-
puts
|
19
|
+
puts 'some output...'
|
24
20
|
|
25
|
-
File.open(testfile, 'w')
|
26
|
-
f.write(
|
27
|
-
|
21
|
+
File.open(testfile, 'w') do |f|
|
22
|
+
f.write('test')
|
23
|
+
end
|
data/examples/run/ctrl_crash.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
|
2
|
+
|
3
|
+
if File.exist?(File.join(lib_dir, 'daemons.rb'))
|
4
|
+
$LOAD_PATH.unshift lib_dir
|
5
|
+
else
|
6
|
+
begin; require 'rubygems'; rescue ::Exception; end
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'daemons'
|
10
|
+
|
11
|
+
options = {
|
12
|
+
:log_output => true,
|
13
|
+
:backtrace => true,
|
14
|
+
:output_logfilename => "custom_output.txt",
|
15
|
+
:logfilename => "custom_log.log"
|
16
|
+
}
|
17
|
+
|
18
|
+
Daemons.run(File.join(File.dirname(__FILE__), 'myserver_crashing.rb'), options)
|
data/examples/run/ctrl_exec.rb
CHANGED
data/examples/run/ctrl_exit.rb
CHANGED