diff --git a/command/agent/command.go b/command/agent/command.go
index a5f59bee9b..314b60612d 100644
--- a/command/agent/command.go
+++ b/command/agent/command.go
@@ -643,10 +643,11 @@ func (c *Command) Run(args []string) int {
}
// Enable child process reaping
- if !config.DisableReap && (os.Getpid() == 1) {
+ if (config.Reap != nil && *config.Reap) || (config.Reap == nil && os.Getpid() == 1) {
logger := c.agent.logger
if !reap.IsSupported() {
- logger.Printf("[WARN] Running as PID 1 but child process reaping is not supported on this platform, disabling")
+ c.Ui.Error("Child process reaping is not supported on this platform (set reap=false)")
+ return 1
} else {
logger.Printf("[DEBUG] Automatically reaping child processes")
diff --git a/command/agent/config.go b/command/agent/config.go
index 50db3244f2..76149d31f8 100644
--- a/command/agent/config.go
+++ b/command/agent/config.go
@@ -423,11 +423,11 @@ type Config struct {
SessionTTLMin time.Duration `mapstructure:"-"`
SessionTTLMinRaw string `mapstructure:"session_ttl_min"`
- // DisableReap controls automatic reaping of child processes, useful if
- // running as PID 1 in a Docker container. This defaults to false, and
- // reaping will be automatically enabled if this is false and Consul's
- // PID is 1.
- DisableReap bool `mapstructure:"disable_reap"`
+ // Reap controls automatic reaping of child processes, useful if running
+ // as PID 1 in a Docker container. This defaults to nil which will make
+ // Consul reap only if it detects it's running as PID 1. If non-nil,
+ // then this will be used to decide if reaping is enabled.
+ Reap *bool `mapstructure:"reap"`
}
// UnixSocketPermissions contains information about a unix socket, and
@@ -1146,8 +1146,8 @@ func MergeConfig(a, b *Config) *Config {
result.RetryJoinWan = append(result.RetryJoinWan, a.RetryJoinWan...)
result.RetryJoinWan = append(result.RetryJoinWan, b.RetryJoinWan...)
- if b.DisableReap {
- result.DisableReap = true
+ if b.Reap != nil {
+ result.Reap = b.Reap
}
return &result
diff --git a/command/agent/config_test.go b/command/agent/config_test.go
index 8ce8236adf..99a5b398ea 100644
--- a/command/agent/config_test.go
+++ b/command/agent/config_test.go
@@ -778,15 +778,25 @@ func TestDecodeConfig(t *testing.T) {
t.Fatalf("bad: %s %#v", config.SessionTTLMin.String(), config)
}
- // DisableReap
- input = `{"disable_reap": true}`
+ // Reap
+ input = `{"reap": true}`
config, err = DecodeConfig(bytes.NewReader([]byte(input)))
if err != nil {
t.Fatalf("err: %s", err)
}
- if config.DisableReap != true {
- t.Fatalf("bad: reap not disabled: %#v", config)
+ if config.Reap == nil || *config.Reap != true {
+ t.Fatalf("bad: reap not enabled: %#v", config)
+ }
+
+ input = `{}`
+ config, err = DecodeConfig(bytes.NewReader([]byte(input)))
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+
+ if config.Reap != nil {
+ t.Fatalf("bad: reap not tri-stated: %#v", config)
}
}
@@ -1168,7 +1178,6 @@ func TestMergeConfig(t *testing.T) {
CheckUpdateIntervalRaw: "8m",
RetryIntervalRaw: "10s",
RetryIntervalWanRaw: "10s",
- DisableReap: false,
}
b := &Config{
@@ -1278,8 +1287,9 @@ func TestMergeConfig(t *testing.T) {
RPC: &net.TCPAddr{},
RPCRaw: "127.0.0.5:1233",
},
- DisableReap: true,
+ Reap: new(bool),
}
+ *b.Reap = true
c := MergeConfig(a, b)
diff --git a/website/source/docs/agent/options.html.markdown b/website/source/docs/agent/options.html.markdown
index aac394f32b..049d434635 100644
--- a/website/source/docs/agent/options.html.markdown
+++ b/website/source/docs/agent/options.html.markdown
@@ -407,10 +407,6 @@ definitions support being updated during a reload.
`disable_anonymous_signature` Disables providing an anonymous signature for de-duplication
with the update check. See [`disable_update_check`](#disable_update_check).
-*
- `disable_reap` will prevent Consul from automatically reaping child processes if it
- detects it is running as PID 1, such as in a Docker container.
-
* `disable_remote_exec`
Disables support for remote execution. When set to true, the agent will ignore any incoming
remote exec requests.
@@ -508,6 +504,11 @@ definitions support being updated during a reload.
* `protocol` Equivalent to the
[`-protocol` command-line flag](#_protocol).
+* `reap` controls Consul's automatic reaping of child processes, which
+ is useful if Consul is running as PID 1 in a Docker container. If this isn't specified, then Consul will
+ automatically reap child processes if it detects it is running as PID 1. If this is specified, then it
+ controls reaping regardless of Consul's PID.
+
* `recursor` Provides a single recursor address.
This has been deprecated, and the value is appended to the [`recursors`](#recursors) list for
backwards compatibility.