mirror of https://github.com/hashicorp/consul
Merge pull request #4244 from MagnumOpus21/WinService
Added a new package service_os that can make Consul run as a service on Windows.pull/4326/head
commit
37c34acf03
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/hashicorp/consul/command/flags"
|
"github.com/hashicorp/consul/command/flags"
|
||||||
"github.com/hashicorp/consul/lib"
|
"github.com/hashicorp/consul/lib"
|
||||||
"github.com/hashicorp/consul/logger"
|
"github.com/hashicorp/consul/logger"
|
||||||
|
"github.com/hashicorp/consul/service_os"
|
||||||
"github.com/hashicorp/go-checkpoint"
|
"github.com/hashicorp/go-checkpoint"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/logutils"
|
"github.com/hashicorp/logutils"
|
||||||
|
@ -277,6 +278,8 @@ func (c *cmd) run(args []string) int {
|
||||||
case ch := <-agent.ReloadCh():
|
case ch := <-agent.ReloadCh():
|
||||||
sig = syscall.SIGHUP
|
sig = syscall.SIGHUP
|
||||||
reloadErrCh = ch
|
reloadErrCh = ch
|
||||||
|
case <-service_os.Shutdown_Channel():
|
||||||
|
sig = os.Interrupt
|
||||||
case <-c.shutdownCh:
|
case <-c.shutdownCh:
|
||||||
sig = os.Interrupt
|
sig = os.Interrupt
|
||||||
case err := <-agent.RetryJoinCh():
|
case err := <-agent.RetryJoinCh():
|
||||||
|
|
1
main.go
1
main.go
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/hashicorp/consul/command"
|
"github.com/hashicorp/consul/command"
|
||||||
"github.com/hashicorp/consul/lib"
|
"github.com/hashicorp/consul/lib"
|
||||||
|
_ "github.com/hashicorp/consul/service_os"
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package service_os
|
||||||
|
|
||||||
|
var chanGraceExit = make(chan int)
|
||||||
|
|
||||||
|
func Shutdown_Channel() <-chan int {
|
||||||
|
return chanGraceExit
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
//+build windows
|
||||||
|
|
||||||
|
package service_os
|
||||||
|
|
||||||
|
import (
|
||||||
|
wsvc "golang.org/x/sys/windows/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type serviceWindows struct{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
interactive, err := wsvc.IsAnInteractiveSession()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if interactive {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
_ = wsvc.Run("", serviceWindows{})
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (serviceWindows) Execute(args []string, r <-chan wsvc.ChangeRequest, s chan<- wsvc.Status) (svcSpecificEC bool, exitCode uint32) {
|
||||||
|
const accCommands = wsvc.AcceptStop | wsvc.AcceptShutdown
|
||||||
|
s <- wsvc.Status{State: wsvc.StartPending}
|
||||||
|
|
||||||
|
s <- wsvc.Status{State: wsvc.Running, Accepts: accCommands}
|
||||||
|
for {
|
||||||
|
c := <-r
|
||||||
|
switch c.Cmd {
|
||||||
|
case wsvc.Interrogate:
|
||||||
|
s <- c.CurrentStatus
|
||||||
|
case wsvc.Stop, wsvc.Shutdown:
|
||||||
|
chanGraceExit <- 1
|
||||||
|
s <- wsvc.Status{State: wsvc.StopPending}
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, 0
|
||||||
|
}
|
|
@ -45,3 +45,5 @@ The following guides are available:
|
||||||
* [Sentinel](/docs/guides/sentinel.html) - This guide covers using Sentinel for policy enforcement in Consul.
|
* [Sentinel](/docs/guides/sentinel.html) - This guide covers using Sentinel for policy enforcement in Consul.
|
||||||
|
|
||||||
* [Server Performance](/docs/guides/performance.html) - This guide covers minimum requirements for Consul servers as well as guidelines for running Consul servers in production.
|
* [Server Performance](/docs/guides/performance.html) - This guide covers minimum requirements for Consul servers as well as guidelines for running Consul servers in production.
|
||||||
|
|
||||||
|
* [Windows Service](/docs/guides/windows-guide.html) - This guide covers how to run Consul as a service on Windows.
|
|
@ -0,0 +1,71 @@
|
||||||
|
---
|
||||||
|
layout: "docs"
|
||||||
|
page_title: "Windows Service"
|
||||||
|
sidebar_current: "docs-guides-windows-service"
|
||||||
|
description: |-
|
||||||
|
By using the _sc_ command either on Powershell or
|
||||||
|
the Windows command line, you can make Consul run as a service. For more details about the _sc_ command
|
||||||
|
the Windows page for [sc](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682107(v=vs.85).aspx)
|
||||||
|
should help you get started.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
By using the _sc_ command either on Powershell or
|
||||||
|
the Windows command line, you can make Consul run as a service. For more details about the _sc_ command
|
||||||
|
the Windows page for [sc](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682107(v=vs.85).aspx)
|
||||||
|
should help you get started.
|
||||||
|
|
||||||
|
Please remember to create a permanent directory for storing the configuration files. It is always
|
||||||
|
advisable to start Consul with the _-config-dir_ option.
|
||||||
|
|
||||||
|
The steps presented here , we assume that the user has launched Powershell with _Adminstrator_ capabilities.
|
||||||
|
|
||||||
|
## Running Consul run as a service on Windows
|
||||||
|
|
||||||
|
### Installing Consul as a Service
|
||||||
|
|
||||||
|
Download the Consul binary for your architecture.
|
||||||
|
|
||||||
|
Use the _sc_ command to create a Service named **Consul**, which starts in the _dev_ mode.
|
||||||
|
|
||||||
|
```text
|
||||||
|
sc.exe create "Consul" binPath="Path to the Consul.exe arg1 arg2 ...argN"
|
||||||
|
[SC] CreateService SUCCESS
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
If you get an output that is similar to the one above, then your service is
|
||||||
|
registered with the Service manager.
|
||||||
|
|
||||||
|
|
||||||
|
If you get an error, please check that
|
||||||
|
you have specified the proper path to the binary and check if you've entered the arguments correctly for the Consul
|
||||||
|
service.
|
||||||
|
|
||||||
|
|
||||||
|
### Running Consul as a service
|
||||||
|
|
||||||
|
You have two ways to start the service.
|
||||||
|
|
||||||
|
* Go to the Windows Service Manager, and look for **Consul** under the
|
||||||
|
service name. Click the _start_ button to start the service.
|
||||||
|
* Using the _sc_ command:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sc.exe start "Consul"
|
||||||
|
|
||||||
|
SERVICE_NAME: Consul
|
||||||
|
TYPE : 10 WIN32_OWN_PROCESS
|
||||||
|
STATE : 4 RUNNING
|
||||||
|
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
|
||||||
|
WIN32_EXIT_CODE : 0 (0x0)
|
||||||
|
SERVICE_EXIT_CODE : 0 (0x0)
|
||||||
|
CHECKPOINT : 0x0
|
||||||
|
WAIT_HINT : 0x0
|
||||||
|
PID : 8008
|
||||||
|
FLAGS :
|
||||||
|
```
|
||||||
|
|
||||||
|
The service automatically starts up during/after boot, so you don't need to
|
||||||
|
launch Consul from the command-line again.
|
|
@ -359,6 +359,9 @@ Certificates</a>
|
||||||
<li<%= sidebar_current("docs-guides-performance") %>>
|
<li<%= sidebar_current("docs-guides-performance") %>>
|
||||||
<a href="/docs/guides/performance.html">Server Performance</a>
|
<a href="/docs/guides/performance.html">Server Performance</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li<%= sidebar_current("docs-guides-windows-service") %>>
|
||||||
|
<a href="/docs/guides/windows-guide.html">Windows (Service)</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue