consul-templaterb 1.27.2 → 1.30.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a67e2df58bcd5c322789984815ff60bd95e50fc047cb20c929a67ca29c07f553
4
- data.tar.gz: c4df4357ae2852ad487eb90336a0d2d7d380767d51d05e02e7b452d29acda9c7
3
+ metadata.gz: 1d751a91e60648e8c967bd3401a6d1d595c01f95a4da6ca3537dad89247d2755
4
+ data.tar.gz: 662f076af6864fd541319e0e0ae4c41e6f09cbc96f578d700c403bd315df7420
5
5
  SHA512:
6
- metadata.gz: 723beb9fca614d1675e50cc1516f37c4aad93815a1725abcdecb33c8bf0aa5e399449f8c3826a14eac8705aa8cb354aa1034796cf68b46304624f958c1b2ba90
7
- data.tar.gz: 379cb1ca86d8edc44c68694f70b6bd7c1373b8b707f26bef3459379554f94fa12f27653354dc52647eadbd2cf5b0df7cec7f01bcb457e7ed159b7396709ce00d
6
+ metadata.gz: c58c6e86c13d2ca37bbb2d4a82aace1d39c27fe76fd4bbf43372d6131d2e14004cbe9d9b6205e40008ab4ad992a44417651aa3739709eb88881d904d3f4161ba
7
+ data.tar.gz: 9f0baecd48f648c0f04a49bc4366d8b85f2cf635d4bb9bd0d572dec9edf3e7fc0a3157f103ef31669cb2856827a4da4cbe73644d9071dcd4de5f3ad4d60451c6
@@ -2,6 +2,48 @@
2
2
 
3
3
  ## (UNRELEASED)
4
4
 
5
+ ## 1.30.0 (Dec 18, 2020)
6
+
7
+ IMPROVEMENTS:
8
+
9
+ * Allow customization to sort nodes in service view in Consul-UI ([#71](https://github.com/criteo/consul-templaterb/pull/71))
10
+
11
+ NEW FEATURES:
12
+
13
+ * Auto-detection of rate-limit on Consul Side (introduced in Consul 1.6.2+), this feature
14
+ will work only Consul 1.9+ (see [Consul #7527](https://github.com/hashicorp/consul/issues/7527)).
15
+
16
+ ## 1.29.0 (Oct 6, 2020)
17
+
18
+ IMPROVEMENTS:
19
+
20
+ * When no template has been specified, stop early with an error message
21
+
22
+ ## 1.28.2 (Oct 5, 2020)
23
+
24
+ NEW FEATURES:
25
+
26
+ * Added new decorator to compute node names in consul-ui ([#70](https://github.com/criteo/consul-templaterb/pull/70))
27
+
28
+ ## 1.28.1 (Sept 30, 2020)
29
+
30
+ IMPROVEMENTS:
31
+
32
+ * Reduced size of GEM from 400k o 100k by removing not needed files
33
+
34
+ ## 1.28.0 (Sept 25, 2020)
35
+
36
+ NEW FEATURES:
37
+
38
+ * Added `-W` or `--wait-between-reload-signal` to avoid sending too many signals
39
+ to a process executed. This avoids for instance reloading too much a HAProxy configuration
40
+ without having to play with `-w` as described in [#69](https://github.com/criteo/consul-templaterb/issues/69)
41
+
42
+ BUG FIXES:
43
+
44
+ * Removed warnings at runtime with Ruby 2.7+
45
+ * Minor JS fix in Consul-UI (Added missing unused parameter to function `serviceTitleGenerator`)
46
+
5
47
  ## 1.27.2 (Sept 4, 2020)
6
48
 
7
49
  IMPROVEMENTS:
@@ -12,7 +54,7 @@ IMPROVEMENTS:
12
54
 
13
55
  BUGIX:
14
56
 
15
- * Fix collision in JSON queries when using payload in requests #68
57
+ * Fix collision in JSON queries when using payload in requests [#68](https://github.com/criteo/consul-templaterb/pull/68)
16
58
 
17
59
  ## 1.27.0 (June 5, 2020)
18
60
 
@@ -25,15 +67,15 @@ NEW FEATURES:
25
67
 
26
68
  ## 1.26.3 (April 15, 2020)
27
69
 
28
- BUGFIX:
70
+ BUG FIXES:
29
71
 
30
72
  * Removed all Criteo specific decorators from Consul-UI
31
73
 
32
74
  ## 1.26.2 (April 15, 2020)
33
75
 
34
- BUGFIX:
76
+ BUG FIXES:
35
77
 
36
- * Fixed broken Dockerfile (was missing the new `decorator.js.erb` file). Fixes #61 (Thanks to @ simongareste)
78
+ * Fixed broken Dockerfile (was missing the new `decorator.js.erb` file). Fixes #61 (Thanks to [@simongareste](https://github.com/simongareste))
37
79
 
38
80
  NEW FEATURES:
39
81
 
@@ -41,7 +83,7 @@ NEW FEATURES:
41
83
 
42
84
  ## 1.26.1 (March 27, 2020)
43
85
 
44
- BUGFIX:
86
+ BUG FIXES:
45
87
 
46
88
  * Using `agent: http://vault_or_consul_agent:port>` was not properly taken into account in some endpoints
47
89
 
@@ -59,7 +101,7 @@ NEW FEATURES:
59
101
 
60
102
  ## 1.25.2 (February 29, 2020)
61
103
 
62
- BUGFIX:
104
+ BUG FIXES:
63
105
 
64
106
  * Update rake to 12.3.3 to fix [CVE-2020-8130](https://github.com/advisories/GHSA-jppv-gw3r-w3q8)
65
107
 
@@ -78,7 +120,7 @@ NEW FEATURES:
78
120
 
79
121
  ## 1.24.1 (February 19, 2020)
80
122
 
81
- BUGFIX:
123
+ BUG FIXES:
82
124
 
83
125
  * Properly set service meta in node meta decorator
84
126
 
@@ -95,7 +137,7 @@ NEW FEATURES:
95
137
  * Implementation of #59 - implementation of `--retry` and `--vault-retry` new flags
96
138
  Those flags work in a similar way as in consul-template: stop program after X failures
97
139
  of consul or vault endpoints
98
- * Added --fail-fast that stop the programs immediately if vault or consul are not available
140
+ * Added `--fail-fast` that stop the programs immediately if vault or consul are not available
99
141
  at startup (also works with `--once`)
100
142
 
101
143
  ## 1.22.0 (January 17, 2020)
@@ -106,7 +148,7 @@ NEW FEATURES:
106
148
 
107
149
  ## 1.21.8 (January 2, 2020)
108
150
 
109
- BUGFIX:
151
+ BUG FIXES:
110
152
 
111
153
  * Escape properly metadata containing double quotes in prometheus exporter
112
154
 
@@ -120,13 +162,13 @@ IMPROVEMENTS:
120
162
 
121
163
  IMPROVEMENTS:
122
164
 
123
- * Added node_meta_info for serviceInstanceDecorator and serviceMetaDecorator
165
+ * Added `node_meta_info` for `serviceInstanceDecorator` and `serviceMetaDecorator` in Consul-UI
124
166
 
125
167
  ## 1.21.5 (December 6, 2019)
126
168
 
127
169
  NEW FEATURES:
128
170
 
129
- * Added clean() method in nodes.js to allow nexw behaviors
171
+ * Added `clean()` method in nodes.js to allow new behaviors
130
172
 
131
173
  ## 1.21.4 (November 28, 2019)
132
174
 
@@ -157,7 +199,7 @@ IMPROVEMENTS:
157
199
  ## 1.21.0 (November 21, 2019)
158
200
 
159
201
  * added function `templates` to list all templates being rendered
160
- * added support for JS decorators in consul-ui (thanks to @Thib17)
202
+ * added support for JS decorators in consul-ui (thanks to [@Thib17](https://github.com/Thib17))
161
203
 
162
204
  ## 1.20.0 (October 16, 2019)
163
205
 
@@ -176,7 +218,7 @@ NEW FEATURES:
176
218
 
177
219
  * Added new function `checks_for_node`
178
220
 
179
- BUGFIXs:
221
+ BUG FIXES:
180
222
 
181
223
  * Avoid try publishing several times Gem on rubygems.org
182
224
 
@@ -198,13 +240,13 @@ IMPROVEMENTS:
198
240
 
199
241
  ## 1.18.3 (September 2, 2019)
200
242
 
201
- BUGFIX:
243
+ BUG FIXES:
202
244
 
203
245
  * When vault receives at timeout, correctly reschedule it
204
246
 
205
247
  ## 1.18.2 (August 28, 2019)
206
248
 
207
- BUGFIX:
249
+ BUG FIXES:
208
250
 
209
251
  * In Consul UI, showing data from KV with markup was not properly handled
210
252
 
@@ -220,7 +262,7 @@ Support any request method for remote_resource.as_json (#41)
220
262
 
221
263
  ## 1.18.1 (July 27, 2019)
222
264
 
223
- BUGFIX:
265
+ BUG FIXES:
224
266
 
225
267
  Fixed wrong lazy initialization in `remote_resource.as_json` that
226
268
  cause too many connections to be opened.
@@ -229,13 +271,13 @@ cause too many connections to be opened.
229
271
 
230
272
  NEW FEATURES:
231
273
 
232
- * Support for `remote_resource` provided by @kamaradclimber
274
+ * Support for `remote_resource` provided by [@kamaradclimber](https://github.com/kamaradclimber)
233
275
  * Added support for `remote_resource.as_json` to fetch JSON remote resource from a web server
234
276
  * Added `samples/list_ruby_versions_from_rubygems.txt.erb` to demonstrate usage
235
277
 
236
278
  ## 1.17.3 (July 18, 2019)
237
279
 
238
- BUGFIX:
280
+ BUG FIXES:
239
281
 
240
282
  * Added gem parallel as a dependency to allow `samples/prometheus_consul_coordinates.erb`
241
283
  to work properly
@@ -360,7 +402,7 @@ NEW FEATURES:
360
402
 
361
403
  ## 1.10.1 (February 28, 2019)
362
404
 
363
- BUGFIX:
405
+ BUG FIXES:
364
406
 
365
407
  * Ensure that timeline sort properly events when healthchecks are removed (eg: maintenance)
366
408
 
@@ -383,7 +425,7 @@ IMPROVEMENTS:
383
425
 
384
426
  ## 1.9.8 (January 16, 2019)
385
427
 
386
- BUGFIX:
428
+ BUG FIXES:
387
429
 
388
430
  * When default value was the same as real value, endpoints were always marked as
389
431
  dirty, thus rendering of templates did never succeed.
@@ -399,7 +441,7 @@ IMPROVEMENTS:
399
441
 
400
442
  ## 1.9.6 (January 15, 2019)
401
443
 
402
- BUGFIX:
444
+ BUG FIXES:
403
445
 
404
446
  * Keep connections open properly as it increase timeouts on Consul servers on
405
447
  very large templates
@@ -410,7 +452,7 @@ IMPROVEMENTS:
410
452
 
411
453
  ## 1.9.5 (January 14, 2019)
412
454
 
413
- BUGFIX:
455
+ BUG FIXES:
414
456
 
415
457
  * Ensure to always re-open Connection to Consul agent in case of network error
416
458
 
@@ -460,11 +502,11 @@ IMPROVEMENTS:
460
502
 
461
503
  OPTIMIZATIONS:
462
504
 
463
- * Better network issue because of X-Consul-Index parsing bug
505
+ * Better network usage because of X-Consul-Index parsing bug
464
506
 
465
- NEW FEATURES:
507
+ BUG FIXES:
466
508
 
467
- * value.endpoint.x_consul_index now works as expected
509
+ * `value.endpoint.x_consul_index` now works as expected
468
510
 
469
511
  IMPROVEMENTS:
470
512
 
@@ -504,7 +546,7 @@ NEW FEATURES:
504
546
 
505
547
  ## 1.8.1 (December 12, 2018)
506
548
 
507
- BUGFIX:
549
+ BUG FIXES:
508
550
 
509
551
  * Properly fill `template_info` strtucture when hot reload is performed so templates using
510
552
  `template_info()` new function can behave nicely.
@@ -613,8 +655,8 @@ IMPROVEMENTS:
613
655
  * [Prometheus template](samples/metrics.erb) to export easily Consul
614
656
  informations about nodes, datacenters and all services states
615
657
  * Code style cleanup + travis now enforces Rubocop
616
- * Remove criteo references in spec files thanks to @pierrecdn
617
- * Bitrate display more consistent thanks to @pierrecdn
658
+ * Remove criteo references in spec files thanks to [@pierrecdn](https://github.com/pierrecdn)
659
+ * Bitrate display more consistent thanks to [@pierrecdn](https://github.com/pierrecdn)
618
660
 
619
661
  ## 1.5.3 (September 24, 2018)
620
662
 
data/README.md CHANGED
@@ -165,9 +165,19 @@ USAGE: consul-templaterb [[options]]
165
165
  -f, --[no-]fail-fast If consul/vault endpoints fail at startup, fail immediately
166
166
  -g, --no-gzip-compression Disable GZIP compression in HTTP requests
167
167
  -c, --consul-addr=<address> Address of Consul, eg: http://localhost:8500
168
+ --consul-cert-chain=<path/to/cert_chain>
169
+ Path to Consul TLS client certificate chain to use
170
+ --consul-private-key=<path/to/private_key>
171
+ Path to Consul TLS client private key to use
172
+ --skip-consul-verify-tls Skip verifying Consul TLS via certificate authority (DANGEROUS)
168
173
  -l, --log-level=<log_level> Log level, default=info, any of none|error|info|debug
169
174
  --consul-token=<token> Use a token to connect to Consul
170
175
  -V, --vault-addr=<address> Address of Vault, eg: http://localhost:8200
176
+ --vault-cert-chain=<path/to/cert_chain>
177
+ Path to Vault TLS client certificate chain to use
178
+ --vault-private-key=<path/to/private_key>
179
+ Path to Vault TLS client private key to use
180
+ --skip-vault-verify-tls Skip verifying Vault TLS via certificate authority (DANGEROUS)
171
181
  --vault-token=<token> Token used to authenticate against vault.
172
182
  --[no-]vault-renew Control auto-renewal of the Vault token. Default: activated
173
183
  --vault-retry, --vault-retry-attempts [RETRIES]
@@ -178,10 +188,11 @@ USAGE: consul-templaterb [[options]]
178
188
  -r, --retry-delay=<min_duration> Min Retry delay on Error/Missing Consul Index
179
189
  -k, --hot-reload=<behavior> Control hot reload behaviour, one of :[die (kill daemon on hot reload failure), keep (on error, keep running), disable (hot reload disabled)]
180
190
  -K, --sig-term=kill_signal Signal to send to next --exec command on kill, default=TERM
191
+ -M, --debug-memory-usage Display messages when RAM grows
181
192
  -T, --trim-mode=trim_mode ERB Trim mode to use (- by default)
182
193
  -R, --sig-reload=reload_signal Signal to send to next --exec command on reload (NONE supported), default=HUP
183
- -M, --debug-memory-usage Display messages when RAM grows
184
- -e, --exec=<command> Execute the following command
194
+ -W, --wait-signal=min_duration Wait at least n seconds before each reload signal being sent to next --exec process
195
+ -e, --exec=<command> Execute the following command in as a subprocess when all templates are ready
185
196
  -d, --debug-network-usage Debug the network usage
186
197
  -t erb_file:[output]:[command]:[params_file],
187
198
  --template Add a erb template, its output and optional reload command
@@ -235,7 +246,11 @@ nor write the file.
235
246
  Signals can be customized per process. Two signals are supported with options `--sig-reload` and
236
247
  `--sig-term`. When the option is added, the next `--exec` options to start a process will use the
237
248
  given signal. By default, HUP will be sent to reload events (you can use NONE to avoid sending any
238
- reload signal), TERM will be used when leaving consul-templaterb.
249
+ reload signal), TERM will be used when leaving consul-templaterb. A minimum duration between reload
250
+ signals can be specified for each sub process by prepending `--wait-signal=min_duration` to `--exec`
251
+ command.
252
+ In such case, the signal will be sent every `min_duration` as a maximum (very useful for templates
253
+ changing a lot, but you don't want to trigger too many reloads, for instance for a load-balancer).
239
254
 
240
255
  ### Bandwidth limitation
241
256
 
@@ -388,7 +388,7 @@ name or its ID. If DC is specified, will lookup for given node in another datace
388
388
 
389
389
  [Find all the checks](https://www.consul.io/api/health.html#list-checks-for-service) of a given service.
390
390
 
391
- ## def checks_in_state(check_state, dc: nil, [agent: consul_agent_address])
391
+ ## checks_in_state(check_state, dc: nil, [agent: consul_agent_address])
392
392
 
393
393
  [Find all the checks in a given state](https://www.consul.io/api-docs/health#list-checks-in-state) in the whole cluster.
394
394
 
@@ -94,6 +94,7 @@ consul_engine = Consul::Async::ConsulTemplateEngine.new
94
94
  @programs = {}
95
95
  cur_sig_reload = 'HUP'.freeze
96
96
  cur_sig_term = 'TERM'.freeze
97
+ cur_min_duration_between_signals = 1
97
98
 
98
99
  optparse = OptionParser.new do |opts|
99
100
  opts.banner = usage_text
@@ -215,6 +216,10 @@ optparse = OptionParser.new do |opts|
215
216
  cur_sig_term = compute_signal(sig, nil)
216
217
  end
217
218
 
219
+ opts.on('-M', '--debug-memory-usage', 'Display messages when RAM grows') do
220
+ consul_engine.debug_memory = true
221
+ end
222
+
218
223
  opts.on('-T', '--trim-mode=trim_mode', String,
219
224
  "ERB Trim mode to use (#{options[:erb][:trim_mode]} by default)") do |trim_mode|
220
225
  options[:erb][:trim_mode] = trim_mode
@@ -225,25 +230,36 @@ optparse = OptionParser.new do |opts|
225
230
  cur_sig_reload = compute_signal(sig, 'NONE')
226
231
  end
227
232
 
228
- opts.on('-M', '--debug-memory-usage', 'Display messages when RAM grows') do
229
- consul_engine.debug_memory = true
233
+ opts.on('-W', '--wait-signal=min_duration', Float, 'Wait at least n seconds before each reload signal being sent to next --exec process') do |min_duration|
234
+ raise "-wait-between-reload-signal=#{min_duration} must be greater than 0" unless min_duration.positive?
235
+
236
+ cur_min_duration_between_signals = min_duration
230
237
  end
231
238
 
232
- opts.on('-e', '--exec=<command>', String, 'Execute the following command') do |cmd|
239
+ opts.on('-e', '--exec=<command>', String, 'Execute the following command in as a subprocess when all templates are ready') do |cmd|
233
240
  sig_reload = cur_sig_reload
234
241
  sig_term = cur_sig_term
242
+ sig_min_interval = cur_min_duration_between_signals
235
243
  consul_engine.add_template_callback do |all_ready, template_manager, results|
236
244
  if all_ready
237
245
  modified = results.any?(&:modified)
238
246
  if @programs[cmd].nil?
239
- warn "[EXEC] Starting process: #{cmd}... on_reload=#{sig_reload || 'NONE'} on_term=#{sig_term}"
247
+ warn "[EXEC] Starting process: #{cmd}... on_reload=#{sig_reload || 'NONE'} on_term=#{sig_term}, delay between reloads=#{sig_min_interval}s"
240
248
  @programs[cmd] = Consul::Async::ProcessHandler.new(cmd, sig_reload: sig_reload, sig_term: sig_term)
241
249
  @programs[cmd].start
242
250
  else
251
+
243
252
  # At least one template has been modified
244
- @programs[cmd].reload if modified
253
+ process_to_reload = @programs[cmd]
254
+ if modified && !process_to_reload.reload_scheduled
255
+ process_to_reload.reload_scheduled = true
256
+ now = Time.now
257
+ delay = sig_min_interval - (now - @programs[cmd].last_signal_sent)
258
+ delay = 0 if delay.negative?
259
+ EventMachine.add_timer(delay) { process_to_reload.reload }
260
+ end
245
261
  begin
246
- @programs[cmd].process_status
262
+ process_to_reload.process_status
247
263
  rescue Consul::Async::ProcessDoesNotExist => e
248
264
  warn "[FATAL] The process is dead, aborting run: #{e.inspect}"
249
265
  template_manager.terminate
@@ -359,6 +375,11 @@ ARGV.each do |tpl|
359
375
  consul_engine.add_template(tpl, dest)
360
376
  end
361
377
 
378
+ if consul_engine.templates.count.zero?
379
+ puts 'You must specify at least one template as arg or using -t'
380
+ exit 255
381
+ end
382
+
362
383
  template_manager = Consul::Async::EndPointsManager.new(consul_conf, vault_conf, consul_engine.templates, options[:erb][:trim_mode])
363
384
 
364
385
  Signal.trap('USR1', 'IGNORE') unless Gem.win_platform?
@@ -225,9 +225,34 @@ module Consul
225
225
  retry_in / 2 + Consul::Async::Utilities.random.rand(retry_in)
226
226
  end
227
227
 
228
+ # rubocop:disable Style/ClassVars
229
+ def _last_429
230
+ @@_last_429 ||= { count: 0 }
231
+ end
232
+ # rubocop:enable Style/ClassVars
233
+
228
234
  def _handle_error(http, consul_index)
229
235
  retry_in = _compute_retry_in([600, conf.retry_duration + 2**@consecutive_errors].min)
230
- ::Consul::Async::Debug.puts_error "[#{path}] X-Consul-Index:#{consul_index} - #{http.error} - Retry in #{retry_in}s #{stats.body_bytes_human}"
236
+ if http.response_header.status == 429
237
+ _last_429
238
+ retry_in = 60 + Consul::Async::Utilities.random.rand(180) if retry_in < 60
239
+ _last_429[:time] = Time.now.utc
240
+ _last_429[:count] += 1
241
+ if (_last_429[:count] % 10) == 1
242
+ if _last_429[:count] == 1
243
+ ::Consul::Async::Debug.puts_error "Rate limiting detected on Consul side (HTTP 429)!\n\n" \
244
+ "******************************* CONFIGURATION ISSUE DETECTED *******************************\n" \
245
+ "* Too many simultaneous connections for Consul agent #{conf.base_url}\n" \
246
+ "* You should tune 'limits.http_max_conns_per_client' to a higher value.\n" \
247
+ "* This program will behave badly until you change this.\n" \
248
+ "* See https://www.consul.io/docs/agent/options.html#http_max_conns_per_client for more info\n" \
249
+ "********************************************************************************************\n\n"
250
+ end
251
+ ::Consul::Async::Debug.puts_error "[#{path}] Too many conns to #{conf.base_url}, errors=#{_last_429[:count]} - Retry in #{retry_in}s #{stats.body_bytes_human}"
252
+ end
253
+ else
254
+ ::Consul::Async::Debug.puts_error "[#{path}] X-Consul-Index:#{consul_index} - #{http.error} - Retry in #{retry_in}s #{stats.body_bytes_human}"
255
+ end
231
256
  @consecutive_errors += 1
232
257
  http_result = HttpResponse.new(http)
233
258
  EventMachine.add_timer(retry_in) do
@@ -59,7 +59,7 @@ module Consul
59
59
  return false unless new_template != @template
60
60
 
61
61
  # We render to ensure the template is valid
62
- render(new_template, current_template_info)
62
+ render(new_template, current_template_info: current_template_info)
63
63
  @template = new_template.freeze
64
64
  true
65
65
  end
@@ -7,7 +7,8 @@ module Consul
7
7
  # Handle the full lifecycle of a process and allows to forward
8
8
  # Posix signals to child process when needed.
9
9
  class ProcessHandler
10
- attr_reader :command, :sig_reload, :sig_term, :pid, :exit_status
10
+ attr_reader :command, :sig_reload, :sig_term, :pid, :exit_status, :last_signal_sent, :reload_scheduled
11
+ attr_writer :reload_scheduled
11
12
  def initialize(command, sig_reload: 'HUP', sig_term: 'TERM')
12
13
  raise 'empty sig_term is not supported' unless sig_term
13
14
 
@@ -16,18 +17,23 @@ module Consul
16
17
  @sig_term = sig_term
17
18
  @pid = nil
18
19
  @exit_status = nil
20
+ @last_signal_sent = Time.now
21
+ @reload_scheduled = false
19
22
  end
20
23
 
21
24
  def start
22
25
  return pid unless pid.nil?
23
26
 
24
27
  @pid = Process.spawn(command)
28
+ @last_signal_sent = Time.now
25
29
  end
26
30
 
27
31
  def reload
28
32
  return if sig_reload.nil?
29
33
 
34
+ @last_signal_sent = Time.now
30
35
  warn "Sending SIG #{sig_reload} to #{pid}..."
36
+ @reload_scheduled = false
31
37
  begin
32
38
  Process.kill(sig_reload, pid)
33
39
  rescue Errno::ESRCH => e