thin 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of thin might be problematic. Click here for more details.

Files changed (91) hide show
  1. data/COPYING +18 -0
  2. data/README +32 -45
  3. data/Rakefile +66 -23
  4. data/bin/thin +76 -45
  5. data/doc/benchmarks.txt +64 -249
  6. data/doc/rdoc/created.rid +1 -1
  7. data/doc/rdoc/files/README.html +37 -100
  8. data/doc/rdoc/rdoc-style.css +5 -0
  9. data/example/config.ru +9 -0
  10. data/ext/thin_parser/common.rl +54 -0
  11. data/ext/thin_parser/ext_help.h +14 -0
  12. data/ext/thin_parser/extconf.rb +6 -0
  13. data/ext/thin_parser/parser.c +1199 -0
  14. data/ext/thin_parser/parser.h +49 -0
  15. data/ext/thin_parser/parser.rl +143 -0
  16. data/ext/thin_parser/thin.c +424 -0
  17. data/lib/rack/adapter/rails.rb +136 -0
  18. data/lib/rack/handler/thin.rb +13 -0
  19. data/lib/thin.rb +28 -12
  20. data/lib/thin/connection.rb +47 -0
  21. data/lib/thin/daemonizing.rb +5 -1
  22. data/lib/thin/headers.rb +3 -2
  23. data/lib/thin/logging.rb +6 -13
  24. data/lib/thin/request.rb +53 -133
  25. data/lib/thin/response.rb +21 -25
  26. data/lib/thin/server.rb +30 -94
  27. data/lib/thin/version.rb +2 -2
  28. data/lib/thin_parser.bundle +0 -0
  29. data/spec/daemonizing_spec.rb +94 -0
  30. data/spec/headers_spec.rb +35 -0
  31. data/spec/request_spec.rb +258 -0
  32. data/spec/response_spec.rb +40 -0
  33. data/spec/server_spec.rb +75 -0
  34. data/spec/spec_helper.rb +126 -0
  35. metadata +79 -99
  36. data/bin/thin_cluster +0 -53
  37. data/doc/rdoc/classes/Kernel.html +0 -182
  38. data/doc/rdoc/classes/Process.html +0 -175
  39. data/doc/rdoc/classes/Thin.html +0 -184
  40. data/doc/rdoc/classes/Thin/CGIWrapper.html +0 -438
  41. data/doc/rdoc/classes/Thin/Cluster.html +0 -392
  42. data/doc/rdoc/classes/Thin/Command.html +0 -221
  43. data/doc/rdoc/classes/Thin/CommandError.html +0 -154
  44. data/doc/rdoc/classes/Thin/Commands.html +0 -145
  45. data/doc/rdoc/classes/Thin/Daemonizable.html +0 -250
  46. data/doc/rdoc/classes/Thin/Daemonizable/ClassMethods.html +0 -203
  47. data/doc/rdoc/classes/Thin/DirHandler.html +0 -250
  48. data/doc/rdoc/classes/Thin/Handler.html +0 -195
  49. data/doc/rdoc/classes/Thin/Headers.html +0 -244
  50. data/doc/rdoc/classes/Thin/InvalidRequest.html +0 -150
  51. data/doc/rdoc/classes/Thin/Logging.html +0 -214
  52. data/doc/rdoc/classes/Thin/RailsHandler.html +0 -234
  53. data/doc/rdoc/classes/Thin/RailsServer.html +0 -175
  54. data/doc/rdoc/classes/Thin/Request.html +0 -379
  55. data/doc/rdoc/classes/Thin/Response.html +0 -311
  56. data/doc/rdoc/classes/Thin/Server.html +0 -381
  57. data/doc/rdoc/files/bin/thin.html +0 -188
  58. data/doc/rdoc/files/bin/thin_cluster.html +0 -175
  59. data/doc/rdoc/files/lib/thin/cgi_rb.html +0 -263
  60. data/doc/rdoc/files/lib/thin/cluster_rb.html +0 -263
  61. data/doc/rdoc/files/lib/thin/command_rb.html +0 -263
  62. data/doc/rdoc/files/lib/thin/consts_rb.html +0 -263
  63. data/doc/rdoc/files/lib/thin/daemonizing_rb.html +0 -263
  64. data/doc/rdoc/files/lib/thin/handler_rb.html +0 -263
  65. data/doc/rdoc/files/lib/thin/headers_rb.html +0 -263
  66. data/doc/rdoc/files/lib/thin/logging_rb.html +0 -263
  67. data/doc/rdoc/files/lib/thin/mime_types_rb.html +0 -263
  68. data/doc/rdoc/files/lib/thin/rails_rb.html +0 -263
  69. data/doc/rdoc/files/lib/thin/recipes_rb.html +0 -171
  70. data/doc/rdoc/files/lib/thin/request_rb.html +0 -171
  71. data/doc/rdoc/files/lib/thin/response_rb.html +0 -171
  72. data/doc/rdoc/files/lib/thin/server_rb.html +0 -171
  73. data/doc/rdoc/files/lib/thin/statuses_rb.html +0 -171
  74. data/doc/rdoc/files/lib/thin/version_rb.html +0 -171
  75. data/lib/thin/cgi.rb +0 -159
  76. data/lib/thin/cluster.rb +0 -147
  77. data/lib/thin/command.rb +0 -49
  78. data/lib/thin/commands/cluster/base.rb +0 -24
  79. data/lib/thin/commands/cluster/config.rb +0 -36
  80. data/lib/thin/commands/cluster/restart.rb +0 -35
  81. data/lib/thin/commands/cluster/start.rb +0 -40
  82. data/lib/thin/commands/cluster/stop.rb +0 -28
  83. data/lib/thin/commands/server/base.rb +0 -7
  84. data/lib/thin/commands/server/start.rb +0 -33
  85. data/lib/thin/commands/server/stop.rb +0 -29
  86. data/lib/thin/consts.rb +0 -37
  87. data/lib/thin/handler.rb +0 -57
  88. data/lib/thin/mime_types.rb +0 -619
  89. data/lib/thin/rails.rb +0 -44
  90. data/lib/thin/recipes.rb +0 -36
  91. data/lib/transat/parser.rb +0 -247
@@ -1,250 +0,0 @@
1
-
2
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3
- <html>
4
- <head>
5
- <title>
6
- thin &raquo; Module: Thin::Daemonizable
7
- </title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
- <script language="JavaScript" type="text/javascript">
11
- // <![CDATA[
12
-
13
- function toggleSource( id )
14
- {
15
- var elem
16
- var link
17
-
18
- if( document.getElementById )
19
- {
20
- elem = document.getElementById( id )
21
- link = document.getElementById( "l_" + id )
22
- }
23
- else if ( document.all )
24
- {
25
- elem = eval( "document.all." + id )
26
- link = eval( "document.all.l_" + id )
27
- }
28
- else
29
- return false;
30
-
31
- if( elem.style.display == "block" )
32
- {
33
- elem.style.display = "none"
34
- link.innerHTML = "show source"
35
- }
36
- else
37
- {
38
- elem.style.display = "block"
39
- link.innerHTML = "hide source"
40
- }
41
- }
42
-
43
- function openCode( url )
44
- {
45
- window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
46
- }
47
- // ]]>
48
- </script>
49
- </head>
50
- <body>
51
- <ul id="menu">
52
- <li><a href="/thin/">home</a></li>
53
- <li><a href="/thin/doc/">doc</a></li>
54
- <li><a href="/thin/trac.fcgi/timeline">timeline</a></li>
55
- <li><a href="/thin/trac.fcgi/browser">code</a></li>
56
- <li><a href="/thin/trac.fcgi/report">tickets</a></li>
57
- <li><a href="/thin/trac.fcgi/newticket">new ticket</a></li>
58
- </ul>
59
- <div id="sidebar">
60
- <h2>Files</h2>
61
- <ul class="list">
62
- <li><a href="../../files/README.html" value="File: README">README</a></li>
63
- <li><a href="../../files/lib/thin/cgi_rb.html" value="File: cgi.rb">lib/thin/cgi.rb</a></li>
64
- <li><a href="../../files/lib/thin/cluster_rb.html" value="File: cluster.rb">lib/thin/cluster.rb</a></li>
65
- <li><a href="../../files/lib/thin/command_rb.html" value="File: command.rb">lib/thin/command.rb</a></li>
66
- <li><a href="../../files/lib/thin/consts_rb.html" value="File: consts.rb">lib/thin/consts.rb</a></li>
67
- <li><a href="../../files/lib/thin/daemonizing_rb.html" value="File: daemonizing.rb">lib/thin/daemonizing.rb</a></li>
68
- <li><a href="../../files/lib/thin/handler_rb.html" value="File: handler.rb">lib/thin/handler.rb</a></li>
69
- <li><a href="../../files/lib/thin/headers_rb.html" value="File: headers.rb">lib/thin/headers.rb</a></li>
70
- <li><a href="../../files/lib/thin/logging_rb.html" value="File: logging.rb">lib/thin/logging.rb</a></li>
71
- <li><a href="../../files/lib/thin/mime_types_rb.html" value="File: mime_types.rb">lib/thin/mime_types.rb</a></li>
72
- <li><a href="../../files/lib/thin/rails_rb.html" value="File: rails.rb">lib/thin/rails.rb</a></li>
73
- <li><a href="../../files/lib/thin/recipes_rb.html" value="File: recipes.rb">lib/thin/recipes.rb</a></li>
74
- <li><a href="../../files/lib/thin/request_rb.html" value="File: request.rb">lib/thin/request.rb</a></li>
75
- <li><a href="../../files/lib/thin/response_rb.html" value="File: response.rb">lib/thin/response.rb</a></li>
76
- <li><a href="../../files/lib/thin/server_rb.html" value="File: server.rb">lib/thin/server.rb</a></li>
77
- <li><a href="../../files/lib/thin/statuses_rb.html" value="File: statuses.rb">lib/thin/statuses.rb</a></li>
78
- <li><a href="../../files/lib/thin/version_rb.html" value="File: version.rb">lib/thin/version.rb</a></li>
79
- <li><a href="../../files/bin/thin.html" value="File: thin">bin/thin</a></li>
80
- <li><a href="../../files/bin/thin_cluster.html" value="File: thin_cluster">bin/thin_cluster</a></li>
81
- </ul>
82
-
83
- <h2>Classes</h2>
84
- <ul class="list">
85
- <li><a href="../../classes/Thin.html" title="Module: Thin">Thin</a></li>
86
- <li><a href="../../classes/Thin/Commands.html" title="Module: Thin::Commands">Thin::Commands</a></li>
87
- <li><a href="../../classes/Thin/Daemonizable.html" title="Module: Thin::Daemonizable">Thin::Daemonizable</a></li>
88
- <li><a href="../../classes/Thin/Daemonizable/ClassMethods.html" title="Module: Thin::Daemonizable::ClassMethods">Thin::Daemonizable::ClassMethods</a></li>
89
- <li><a href="../../classes/Thin/VERSION.html" title="Module: Thin::VERSION">Thin::VERSION</a></li>
90
- <li><a href="../../classes/Thin/Logging.html" title="Module: Thin::Logging">Thin::Logging</a></li>
91
- <li><a href="../../classes/Thin/DirHandler.html" title="Class: Thin::DirHandler">Thin::DirHandler</a></li>
92
- <li><a href="../../classes/Thin/InvalidRequest.html" title="Class: Thin::InvalidRequest">Thin::InvalidRequest</a></li>
93
- <li><a href="../../classes/Thin/CGIWrapper.html" title="Class: Thin::CGIWrapper">Thin::CGIWrapper</a></li>
94
- <li><a href="../../classes/Thin/Command.html" title="Class: Thin::Command">Thin::Command</a></li>
95
- <li><a href="../../classes/Thin/Response.html" title="Class: Thin::Response">Thin::Response</a></li>
96
- <li><a href="../../classes/Thin/Headers.html" title="Class: Thin::Headers">Thin::Headers</a></li>
97
- <li><a href="../../classes/Thin/Server.html" title="Class: Thin::Server">Thin::Server</a></li>
98
- <li><a href="../../classes/Thin/CommandError.html" title="Class: Thin::CommandError">Thin::CommandError</a></li>
99
- <li><a href="../../classes/Thin/Request.html" title="Class: Thin::Request">Thin::Request</a></li>
100
- <li><a href="../../classes/Thin/RailsServer.html" title="Class: Thin::RailsServer">Thin::RailsServer</a></li>
101
- <li><a href="../../classes/Thin/Cluster.html" title="Class: Thin::Cluster">Thin::Cluster</a></li>
102
- <li><a href="../../classes/Thin/RailsHandler.html" title="Class: Thin::RailsHandler">Thin::RailsHandler</a></li>
103
- <li><a href="../../classes/Thin/Handler.html" title="Class: Thin::Handler">Thin::Handler</a></li>
104
- <li><a href="../../classes/Process.html" title="Module: Process">Process</a></li>
105
- <li><a href="../../classes/Kernel.html" title="Module: Kernel">Kernel</a></li>
106
- </ul>
107
- </div>
108
- <div id="container">
109
- <div id="header">
110
- <a href="/thin/" title="Home">
111
- <img id="logo" src="../../logo.gif" />
112
- </a>
113
- <h2 id="tag_line">A fast and very simple Ruby web server</h2>
114
- </div>
115
-
116
- <div id="content">
117
- <h2>Module: Thin::Daemonizable</h2>
118
-
119
-
120
- <div id="Thin::Daemonizable" class="page_shade">
121
- <div class="page">
122
- <h3>Module Thin::Daemonizable</h3>
123
-
124
- <span class="path">(in files
125
- <a href="../../files/lib/thin/daemonizing_rb.html">lib/thin/daemonizing.rb</a>
126
- )</span>
127
-
128
- <p>
129
- Module <a href="Daemonizable.html#M000002">included</a> in classes that can
130
- be turned into a daemon. Handle stuff like:
131
- </p>
132
- <ul>
133
- <li>storing the PID in a file
134
-
135
- </li>
136
- <li>redirecting output to the log file
137
-
138
- </li>
139
- <li>changing processs privileges
140
-
141
- </li>
142
- <li>killing the process gracefully
143
-
144
- </li>
145
- </ul>
146
-
147
-
148
-
149
-
150
-
151
- <h2 class="ruled">Methods</h2>
152
- <h4 class="ruled">
153
- <span class="method-type" title="Public Class method">Public Class</span>
154
- <strong><a name="M000002" href="#M000002" title="Permalink to Public Class method: included">included(base)</a></strong>
155
- </h4>
156
-
157
-
158
- <div class="sourcecode">
159
- <p class="source-link">[ <a href="javascript:toggleSource('M000002_source')" id="l_M000002_source">show source</a> ]</p>
160
- <div id="M000002_source" class="dyn-source">
161
- <pre>
162
- <span class="ruby-comment cmt"># File lib/thin/daemonizing.rb, line 41</span>
163
- 41: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">included</span>(<span class="ruby-identifier">base</span>)
164
- 42: <span class="ruby-identifier">base</span>.<span class="ruby-identifier">extend</span> <span class="ruby-constant">ClassMethods</span>
165
- 43: <span class="ruby-keyword kw">end</span>
166
- </pre>
167
- </div>
168
- </div>
169
- <h4 class="ruled">
170
- <span class="method-type" title="Public Instance method">Public Instance</span>
171
- <strong><a name="M000004" href="#M000004" title="Permalink to Public Instance method: change_privilege">change_privilege(user, group=user)</a></strong>
172
- </h4>
173
-
174
- <p>
175
- Change privileges of the process to the specified user and group.
176
- </p>
177
-
178
- <div class="sourcecode">
179
- <p class="source-link">[ <a href="javascript:toggleSource('M000004_source')" id="l_M000004_source">show source</a> ]</p>
180
- <div id="M000004_source" class="dyn-source">
181
- <pre>
182
- <span class="ruby-comment cmt"># File lib/thin/daemonizing.rb, line 67</span>
183
- 67: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">change_privilege</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">group</span>=<span class="ruby-identifier">user</span>)
184
- 68: <span class="ruby-identifier">log</span> <span class="ruby-node">&quot;&gt;&gt; Changing process privilege to #{user}:#{group}&quot;</span>
185
- 69:
186
- 70: <span class="ruby-identifier">uid</span>, <span class="ruby-identifier">gid</span> = <span class="ruby-constant">Process</span>.<span class="ruby-identifier">euid</span>, <span class="ruby-constant">Process</span>.<span class="ruby-identifier">egid</span>
187
- 71: <span class="ruby-identifier">target_uid</span> = <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getpwnam</span>(<span class="ruby-identifier">user</span>).<span class="ruby-identifier">uid</span>
188
- 72: <span class="ruby-identifier">target_gid</span> = <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getgrnam</span>(<span class="ruby-identifier">group</span>).<span class="ruby-identifier">gid</span>
189
- 73:
190
- 74: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">uid</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">target_uid</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">gid</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">target_gid</span>
191
- 75: <span class="ruby-comment cmt"># Change process ownership</span>
192
- 76: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">initgroups</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">target_gid</span>)
193
- 77: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-constant">GID</span>.<span class="ruby-identifier">change_privilege</span>(<span class="ruby-identifier">target_gid</span>)
194
- 78: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-constant">UID</span>.<span class="ruby-identifier">change_privilege</span>(<span class="ruby-identifier">target_uid</span>)
195
- 79: <span class="ruby-keyword kw">end</span>
196
- 80: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPERM</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
197
- 81: <span class="ruby-identifier">log</span> <span class="ruby-node">&quot;Couldn't change user and group to #{user}:#{group}: #{e}&quot;</span>
198
- 82: <span class="ruby-keyword kw">end</span>
199
- </pre>
200
- </div>
201
- </div>
202
- <h4 class="ruled">
203
- <span class="method-type" title="Public Instance method">Public Instance</span>
204
- <strong><a name="M000003" href="#M000003" title="Permalink to Public Instance method: daemonize">daemonize()</a></strong>
205
- </h4>
206
-
207
- <p>
208
- Turns the current script into a daemon process that detaches from the
209
- console.
210
- </p>
211
-
212
- <div class="sourcecode">
213
- <p class="source-link">[ <a href="javascript:toggleSource('M000003_source')" id="l_M000003_source">show source</a> ]</p>
214
- <div id="M000003_source" class="dyn-source">
215
- <pre>
216
- <span class="ruby-comment cmt"># File lib/thin/daemonizing.rb, line 46</span>
217
- 46: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">daemonize</span>
218
- 47: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-value str">'You must specify a pid_file to deamonize'</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@pid_file</span>
219
- 48:
220
- 49: <span class="ruby-identifier">pwd</span> = <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">pwd</span> <span class="ruby-comment cmt"># Current directory is changed during daemonization, so store it</span>
221
- 50: <span class="ruby-keyword kw">super</span> <span class="ruby-comment cmt"># Calls Kernel#daemonize</span>
222
- 51: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">chdir</span> <span class="ruby-identifier">pwd</span>
223
- 52:
224
- 53: <span class="ruby-identifier">trap</span>(<span class="ruby-value str">'HUP'</span>, <span class="ruby-value str">'IGNORE'</span>) <span class="ruby-comment cmt"># Don't die upon logout</span>
225
- 54:
226
- 55: <span class="ruby-comment cmt"># Redirect output to the logfile</span>
227
- 56: [<span class="ruby-constant">STDOUT</span>, <span class="ruby-constant">STDERR</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">reopen</span> <span class="ruby-ivar">@log_file</span>, <span class="ruby-value str">'a'</span> } <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@log_file</span>
228
- 57:
229
- 58: <span class="ruby-identifier">write_pid_file</span>
230
- 59: <span class="ruby-identifier">at_exit</span> <span class="ruby-keyword kw">do</span>
231
- 60: <span class="ruby-identifier">log</span> <span class="ruby-value str">&quot;&gt;&gt; Exiting!&quot;</span>
232
- 61: <span class="ruby-identifier">remove_pid_file</span>
233
- 62: <span class="ruby-keyword kw">end</span>
234
- 63: <span class="ruby-keyword kw">end</span>
235
- </pre>
236
- </div>
237
- </div>
238
-
239
- </div>
240
- </div>
241
-
242
-
243
- </div>
244
- </div>
245
- <div id="footer">
246
- <hr />
247
- &copy; <a href="http://macournoyer.com">Marc-Andr&eacute; Cournoyer</a>
248
- </div>
249
- </body>
250
- </html>
@@ -1,203 +0,0 @@
1
-
2
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3
- <html>
4
- <head>
5
- <title>
6
- thin &raquo; Module: Thin::Daemonizable::ClassMethods
7
- </title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
10
- <script language="JavaScript" type="text/javascript">
11
- // <![CDATA[
12
-
13
- function toggleSource( id )
14
- {
15
- var elem
16
- var link
17
-
18
- if( document.getElementById )
19
- {
20
- elem = document.getElementById( id )
21
- link = document.getElementById( "l_" + id )
22
- }
23
- else if ( document.all )
24
- {
25
- elem = eval( "document.all." + id )
26
- link = eval( "document.all.l_" + id )
27
- }
28
- else
29
- return false;
30
-
31
- if( elem.style.display == "block" )
32
- {
33
- elem.style.display = "none"
34
- link.innerHTML = "show source"
35
- }
36
- else
37
- {
38
- elem.style.display = "block"
39
- link.innerHTML = "hide source"
40
- }
41
- }
42
-
43
- function openCode( url )
44
- {
45
- window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
46
- }
47
- // ]]>
48
- </script>
49
- </head>
50
- <body>
51
- <ul id="menu">
52
- <li><a href="/thin/">home</a></li>
53
- <li><a href="/thin/doc/">doc</a></li>
54
- <li><a href="/thin/trac.fcgi/timeline">timeline</a></li>
55
- <li><a href="/thin/trac.fcgi/browser">code</a></li>
56
- <li><a href="/thin/trac.fcgi/report">tickets</a></li>
57
- <li><a href="/thin/trac.fcgi/newticket">new ticket</a></li>
58
- </ul>
59
- <div id="sidebar">
60
- <h2>Files</h2>
61
- <ul class="list">
62
- <li><a href="../../../files/README.html" value="File: README">README</a></li>
63
- <li><a href="../../../files/lib/thin/cgi_rb.html" value="File: cgi.rb">lib/thin/cgi.rb</a></li>
64
- <li><a href="../../../files/lib/thin/cluster_rb.html" value="File: cluster.rb">lib/thin/cluster.rb</a></li>
65
- <li><a href="../../../files/lib/thin/command_rb.html" value="File: command.rb">lib/thin/command.rb</a></li>
66
- <li><a href="../../../files/lib/thin/consts_rb.html" value="File: consts.rb">lib/thin/consts.rb</a></li>
67
- <li><a href="../../../files/lib/thin/daemonizing_rb.html" value="File: daemonizing.rb">lib/thin/daemonizing.rb</a></li>
68
- <li><a href="../../../files/lib/thin/handler_rb.html" value="File: handler.rb">lib/thin/handler.rb</a></li>
69
- <li><a href="../../../files/lib/thin/headers_rb.html" value="File: headers.rb">lib/thin/headers.rb</a></li>
70
- <li><a href="../../../files/lib/thin/logging_rb.html" value="File: logging.rb">lib/thin/logging.rb</a></li>
71
- <li><a href="../../../files/lib/thin/mime_types_rb.html" value="File: mime_types.rb">lib/thin/mime_types.rb</a></li>
72
- <li><a href="../../../files/lib/thin/rails_rb.html" value="File: rails.rb">lib/thin/rails.rb</a></li>
73
- <li><a href="../../../files/lib/thin/recipes_rb.html" value="File: recipes.rb">lib/thin/recipes.rb</a></li>
74
- <li><a href="../../../files/lib/thin/request_rb.html" value="File: request.rb">lib/thin/request.rb</a></li>
75
- <li><a href="../../../files/lib/thin/response_rb.html" value="File: response.rb">lib/thin/response.rb</a></li>
76
- <li><a href="../../../files/lib/thin/server_rb.html" value="File: server.rb">lib/thin/server.rb</a></li>
77
- <li><a href="../../../files/lib/thin/statuses_rb.html" value="File: statuses.rb">lib/thin/statuses.rb</a></li>
78
- <li><a href="../../../files/lib/thin/version_rb.html" value="File: version.rb">lib/thin/version.rb</a></li>
79
- <li><a href="../../../files/bin/thin.html" value="File: thin">bin/thin</a></li>
80
- <li><a href="../../../files/bin/thin_cluster.html" value="File: thin_cluster">bin/thin_cluster</a></li>
81
- </ul>
82
-
83
- <h2>Classes</h2>
84
- <ul class="list">
85
- <li><a href="../../../classes/Thin.html" title="Module: Thin">Thin</a></li>
86
- <li><a href="../../../classes/Thin/Commands.html" title="Module: Thin::Commands">Thin::Commands</a></li>
87
- <li><a href="../../../classes/Thin/Daemonizable.html" title="Module: Thin::Daemonizable">Thin::Daemonizable</a></li>
88
- <li><a href="../../../classes/Thin/Daemonizable/ClassMethods.html" title="Module: Thin::Daemonizable::ClassMethods">Thin::Daemonizable::ClassMethods</a></li>
89
- <li><a href="../../../classes/Thin/VERSION.html" title="Module: Thin::VERSION">Thin::VERSION</a></li>
90
- <li><a href="../../../classes/Thin/Logging.html" title="Module: Thin::Logging">Thin::Logging</a></li>
91
- <li><a href="../../../classes/Thin/DirHandler.html" title="Class: Thin::DirHandler">Thin::DirHandler</a></li>
92
- <li><a href="../../../classes/Thin/InvalidRequest.html" title="Class: Thin::InvalidRequest">Thin::InvalidRequest</a></li>
93
- <li><a href="../../../classes/Thin/CGIWrapper.html" title="Class: Thin::CGIWrapper">Thin::CGIWrapper</a></li>
94
- <li><a href="../../../classes/Thin/Command.html" title="Class: Thin::Command">Thin::Command</a></li>
95
- <li><a href="../../../classes/Thin/Response.html" title="Class: Thin::Response">Thin::Response</a></li>
96
- <li><a href="../../../classes/Thin/Headers.html" title="Class: Thin::Headers">Thin::Headers</a></li>
97
- <li><a href="../../../classes/Thin/Server.html" title="Class: Thin::Server">Thin::Server</a></li>
98
- <li><a href="../../../classes/Thin/CommandError.html" title="Class: Thin::CommandError">Thin::CommandError</a></li>
99
- <li><a href="../../../classes/Thin/Request.html" title="Class: Thin::Request">Thin::Request</a></li>
100
- <li><a href="../../../classes/Thin/RailsServer.html" title="Class: Thin::RailsServer">Thin::RailsServer</a></li>
101
- <li><a href="../../../classes/Thin/Cluster.html" title="Class: Thin::Cluster">Thin::Cluster</a></li>
102
- <li><a href="../../../classes/Thin/RailsHandler.html" title="Class: Thin::RailsHandler">Thin::RailsHandler</a></li>
103
- <li><a href="../../../classes/Thin/Handler.html" title="Class: Thin::Handler">Thin::Handler</a></li>
104
- <li><a href="../../../classes/Process.html" title="Module: Process">Process</a></li>
105
- <li><a href="../../../classes/Kernel.html" title="Module: Kernel">Kernel</a></li>
106
- </ul>
107
- </div>
108
- <div id="container">
109
- <div id="header">
110
- <a href="/thin/" title="Home">
111
- <img id="logo" src="../../../logo.gif" />
112
- </a>
113
- <h2 id="tag_line">A fast and very simple Ruby web server</h2>
114
- </div>
115
-
116
- <div id="content">
117
- <h2>Module: Thin::Daemonizable::ClassMethods</h2>
118
-
119
-
120
- <div id="Thin::Daemonizable::ClassMethods" class="page_shade">
121
- <div class="page">
122
- <h3>Module Thin::Daemonizable::ClassMethods</h3>
123
-
124
- <span class="path">(in files
125
- <a href="../../../files/lib/thin/daemonizing_rb.html">lib/thin/daemonizing.rb</a>
126
- )</span>
127
-
128
- <p>
129
- Module <a href="Daemonizable.html#M000002">included</a> in classes that can
130
- be turned into a daemon. Handle stuff like:
131
- </p>
132
- <ul>
133
- <li>storing the PID in a file
134
-
135
- </li>
136
- <li>redirecting output to the log file
137
-
138
- </li>
139
- <li>changing processs privileges
140
-
141
- </li>
142
- <li>killing the process gracefully
143
-
144
- </li>
145
- </ul>
146
-
147
-
148
-
149
-
150
-
151
- <h2 class="ruled">Methods</h2>
152
- <h4 class="ruled">
153
- <span class="method-type" title="Public Instance method">Public Instance</span>
154
- <strong><a name="M000005" href="#M000005" title="Permalink to Public Instance method: kill">kill(pid_file, timeout=60)</a></strong>
155
- </h4>
156
-
157
- <p>
158
- Kill the process which PID is stored in <tt>pid_file</tt>.
159
- </p>
160
-
161
- <div class="sourcecode">
162
- <p class="source-link">[ <a href="javascript:toggleSource('M000005_source')" id="l_M000005_source">show source</a> ]</p>
163
- <div id="M000005_source" class="dyn-source">
164
- <pre>
165
- <span class="ruby-comment cmt"># File lib/thin/daemonizing.rb, line 86</span>
166
- 86: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">kill</span>(<span class="ruby-identifier">pid_file</span>, <span class="ruby-identifier">timeout</span>=<span class="ruby-value">60</span>)
167
- 87: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">pid_file</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">pid</span> = <span class="ruby-identifier">open</span>(<span class="ruby-identifier">pid_file</span>).<span class="ruby-identifier">read</span>
168
- 88: <span class="ruby-identifier">pid</span> = <span class="ruby-identifier">pid</span>.<span class="ruby-identifier">to_i</span>
169
- 89: <span class="ruby-identifier">print</span> <span class="ruby-node">&quot;Sending INT signal to process #{pid} ... &quot;</span>
170
- 90: <span class="ruby-keyword kw">begin</span>
171
- 91: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">kill</span>(<span class="ruby-value str">'INT'</span>, <span class="ruby-identifier">pid</span>)
172
- 92: <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">timeout</span>) <span class="ruby-keyword kw">do</span>
173
- 93: <span class="ruby-identifier">sleep</span> <span class="ruby-value">0</span><span class="ruby-value">.1</span> <span class="ruby-keyword kw">while</span> <span class="ruby-constant">Process</span>.<span class="ruby-identifier">running?</span>(<span class="ruby-identifier">pid</span>)
174
- 94: <span class="ruby-keyword kw">end</span>
175
- 95: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>
176
- 96: <span class="ruby-identifier">print</span> <span class="ruby-value str">&quot;timeout, Sending KILL signal ... &quot;</span>
177
- 97: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">kill</span>(<span class="ruby-value str">'KILL'</span>, <span class="ruby-identifier">pid</span>)
178
- 98: <span class="ruby-keyword kw">end</span>
179
- 99: <span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;stopped!&quot;</span>
180
- 100: <span class="ruby-keyword kw">else</span>
181
- 101: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Can't stop process, no PID found in #{@pid_file}&quot;</span>
182
- 102: <span class="ruby-keyword kw">end</span>
183
- 103: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ESRCH</span> <span class="ruby-comment cmt"># No such process</span>
184
- 104: <span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;process not found!&quot;</span>
185
- 105: <span class="ruby-keyword kw">ensure</span>
186
- 106: <span class="ruby-constant">File</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">pid_file</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
187
- 107: <span class="ruby-keyword kw">end</span>
188
- </pre>
189
- </div>
190
- </div>
191
-
192
- </div>
193
- </div>
194
-
195
-
196
- </div>
197
- </div>
198
- <div id="footer">
199
- <hr />
200
- &copy; <a href="http://macournoyer.com">Marc-Andr&eacute; Cournoyer</a>
201
- </div>
202
- </body>
203
- </html>