Merge pull request #4244 from MagnumOpus21/WinService

Added a new package service_os that can make Consul run as a service on Windows.
This commit is contained in:
Siva Prasad 2018-07-02 12:01:22 -04:00 committed by GitHub
commit 984e22d73a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 129 additions and 0 deletions

View File

@ -17,6 +17,7 @@ import (
"github.com/hashicorp/consul/command/flags"
"github.com/hashicorp/consul/lib"
"github.com/hashicorp/consul/logger"
"github.com/hashicorp/consul/service_os"
"github.com/hashicorp/go-checkpoint"
multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/logutils"
@ -277,6 +278,8 @@ func (c *cmd) run(args []string) int {
case ch := <-agent.ReloadCh():
sig = syscall.SIGHUP
reloadErrCh = ch
case <-service_os.Shutdown_Channel():
sig = os.Interrupt
case <-c.shutdownCh:
sig = os.Interrupt
case err := <-agent.RetryJoinCh():

View File

@ -8,6 +8,7 @@ import (
"github.com/hashicorp/consul/command"
"github.com/hashicorp/consul/lib"
_ "github.com/hashicorp/consul/service_os"
"github.com/mitchellh/cli"
)

7
service_os/service.go Normal file
View File

@ -0,0 +1,7 @@
package service_os
var chanGraceExit = make(chan int)
func Shutdown_Channel() <-chan int {
return chanGraceExit
}

View File

@ -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
}

View File

@ -45,3 +45,5 @@ The following guides are available:
* [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.
* [Windows Service](/docs/guides/windows-guide.html) - This guide covers how to run Consul as a service on Windows.

View File

@ -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.

View File

@ -359,6 +359,9 @@ Certificates</a>
<li<%= sidebar_current("docs-guides-performance") %>>
<a href="/docs/guides/performance.html">Server Performance</a>
</li>
<li<%= sidebar_current("docs-guides-windows-service") %>>
<a href="/docs/guides/windows-guide.html">Windows (Service)</a>
</li>
</ul>
</li>