Installing Nuxeo as a Windows service is independent of Nuxeo. So, this is no longer in our development scope since Nuxeo 5.4.
Multiple solutions are available, here are some of them, given without any warranty.
Once a batch is installed as a service, it cannot be changed: you must first uninstall it, then edit and reinstall in order to change its content.
So, it's generally a good idea to write a batch file wrapping calls to nuxeoctl.bat
and install that NuxeoWrapper.bat
as a service, which will be responsible of starting Nuxeo with the wanted user and environment parameters.
Prerequisites
In order to run as a service, you have to manage the directory rights for the super-user running the service. There are behavior changes depending on the Windows version.
Also, take care that network directories are usually not available when a service is executing. So, if you need to use some, you will have to mount them in the batch script before starting the Nuxeo Platform.
The database used by the Nuxeo Platform has to be installed as a service and started before the Nuxeo service.
Available Solutions
NSSM - Non-Sucking Service Manager (Experimental)
NSSM is a Windows service helper that makes it much more easy to launch any type of application as a service. What is more, it also handles failure, by relaunching applications whenever they exit prematurely. Here are the instructions to install Nuxeo as a Windows service using NSSM:
- Download NSSM from the official website or install it via Chocolatey, by typing:
choco install nssm
- If NSSM was installed via Chocolatey, skip this step. Otherwise, add NSSM's location to PATH.
- Install Nuxeo as a service, by running on an elevated console or powershell:
nssm install "<absolute-path-to-nuxeoctl.bat>" --gui false console
From now on, Nuxeo will start as a service whenever Windows starts. The console
parameter allows the process to stay alive after the server starts, thus preventing NSSM from restarting it.
This seems to be the easiest solution so far, but thorough testing is yet to be performed.
Yet Another Java Service Wrapper (Recommended)
YAJSW is a Java centric implementation of the Java Service Wrapper by tanuki (JSW). It aims at being mostly configuration compliant with the original. YAJSW is LGPL licensed. That solution seems to be the more flexible, robust and multi-OS compliant.
When using this solution it is important that Nuxeo installation path contains no space (typically NOT C:\Program Files\nuxeo
). Otherwise the service wrapper will truncate the path after the space and the service will not start. It is recommended that Nuxeo is installed at the root of the volume (C:\nuxeo\
for instance).
Installing Nuxeo as a Windows Service Using YAJSW
- Download YAJSW and unzip the archive.
- Set the system environment variable
NUXEO_CONF
to the location of yournuxeo.conf
file, something like%NUXEO_HOME%\bin\nuxeo.conf
. Start the Nuxeo Platform from the command line:
nuxeoctl.bat --gui=false start
Once the server is started, you'll get a message like below where XXXX is the process ID of the running Nuxeo application:
Server started with process ID XXXX.
Start a Command Prompt as an Administrator.
- Go to the
%YAJSW_HOME%\bat
folder. Execute the
genConfig
command with the process ID as parameter:genConfig.bat XXXX
The configuration is written in the file
%YAJSW_HOME%\conf\wrapper.conf
.Wrapper Static Configuration Vs nuxeo.confOnce the wrapper configuration is generated, it is static. It means any further start of the Nuxeo service won't read nuxeo.conf to apply configuration changes.
If you edit
nuxeo.conf
after having installed Nuxeo as a service, there are two possibilities:- Your changes are only about the configuration of Nuxeo: you only need to restart Nuxeo one time with its own launcher (step 3).
- Your changes are about JVM options (changes in
JAVA_OPTS
variable: memory, debug ...): you'll have to start Nuxeo with its launcher and generate the new wrapper configuration (step 3 to 6).
In both cases, you don't have to unregister the service and register it again: the wrapper will use the same configuration file (
wrapper.conf
).Stop the Nuxeo Platform.
nuxeoctl.bat --gui=false stop
Open the
wrapper.conf
file:- at the end of the file, add a new line among the additional java options to set the
nuxeo.home
environment property. In the example below, Nuxeo is installed inE:\Nuxeo
and the new line is the 10th wrapper additional option:
wrapper.java.additional.10 = -Dnuxeo.home=E:\\\\Applis\\\\Nuxeo
- make sure the
wrapper.console.title
entry does not contain a colon (":") or therunConsole.bat
execution will fail. In that case, remove the colon or set another title.
- at the end of the file, add a new line among the additional java options to set the
Execute your wrapped application as a console application:
runConsole.bat
Check your application is accessible.
Edit the file
%YAJSW_HOME%\conf\wrapper.conf
set your custom values for these parameters:
# Name of the service wrapper.ntservice.name=NuxeoPlatform # Display name of the service wrapper.ntservice.displayname=Nuxeo Platform # Description of the service wrapper.ntservice.description=Service to manage the Nuxeo Platform wrapper.control = APPLICATION
If set, remove or comment the following
wrapper.on_exit
parameters:#wrapper.on_exit.0=SHUTDOWN #wrapper.on_exit.default=RESTART
With the two above values set, the service would restart every time a server error occurs.
Install the application as a service:
installService.bat
Your service is installed and you can run the Nuxeo Platform from its service ("Windows Computer Management > Services" on Windows 7).
JBoss Native Windows (aka JBossSVC, JBossService and JavaService)
Deprecated Nuxeo scripts managing install as a Windows service were previously used. They were based on JBoss Native Windows which is now not recommended because of a number of defects. However, it was relatively easy to use and provides a quick solution.
As an example, here is the content of jboss-native-2.0.4/bin/service.bat
:
@echo off
REM JBoss, the OpenSource webOS
REM
REM Distributable under LGPL license.
REM See terms of license at gnu.org.
REM
REM -------------------------------------------------------------------------
REM JBoss Service Script for Windows
REM -------------------------------------------------------------------------
@if not "%ECHO%" == "" echo %ECHO%
@if "%OS%" == "Windows_NT" setlocal
set DIRNAME=%CD%
REM
REM VERSION, VERSION_MAJOR and VERSION_MINOR are populated
REM during the build with ant filter.
REM
set SVCNAME=NuxeoEP
set SVCDISP=NuxeoEP
set SVCDESC=Nuxeo 5.3.0-GA / JBoss Application Server 4.2.3 GA / Platform: Windows 64
set NOPAUSE=Y
REM Suppress killing service on logoff event
set JAVA_OPTS=-Xrs
REM Figure out the running mode
if /I "%1" == "install" goto cmdInstall
if /I "%1" == "uninstall" goto cmdUninstall
if /I "%1" == "start" goto cmdStart
if /I "%1" == "stop" goto cmdStop
if /I "%1" == "restart" goto cmdRestart
if /I "%1" == "signal" goto cmdSignal
echo Usage: service install^|uninstall^|start^|stop^|restart^|signal
goto cmdEnd
REM jbosssvc retun values
REM ERR_RET_USAGE 1
REM ERR_RET_VERSION 2
REM ERR_RET_INSTALL 3
REM ERR_RET_REMOVE 4
REM ERR_RET_PARAMS 5
REM ERR_RET_MODE 6
:errExplain
if errorlevel 1 echo Invalid command line parameters
if errorlevel 2 echo Failed installing %SVCDISP%
if errorlevel 4 echo Failed removing %SVCDISP%
if errorlevel 6 echo Unknown service mode for %SVCDISP%
goto cmdEnd
:cmdInstall
jbosssvc.exe -imwdc %SVCNAME% "%DIRNAME%" "%SVCDISP%" "%SVCDESC%" service.bat
if not errorlevel 0 goto errExplain
echo Service %SVCDISP% installed
goto cmdEnd
:cmdUninstall
jbosssvc.exe -u %SVCNAME%
if not errorlevel 0 goto errExplain
echo Service %SVCDISP% removed
goto cmdEnd
:cmdStart
REM Executed on service start
del .r.lock 2>&1 | findstr /C:"being used" > nul
if not errorlevel 1 (
echo Could not continue. Locking file already in use.
goto cmdEnd
)
echo Y > .r.lock
jbosssvc.exe -p 1 "Starting %SVCDISP%" > run.log
call run.bat -b 0.0.0.0 < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
goto cmdEnd
:cmdStop
REM Executed on service stop
echo Y > .s.lock
jbosssvc.exe -p 1 "Shutting down %SVCDISP%" > shutdown.log
call shutdown -S < .s.lock >> shutdown.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> shutdown.log
del .s.lock
goto cmdEnd
:cmdRestart
REM Executed manually from command line
REM Note: We can only stop and start
echo Y > .s.lock
jbosssvc.exe -p 1 "Shutting down %SVCDISP%" >> shutdown.log
call shutdown -S < .s.lock >> shutdown.log 2>&1
del .s.lock
:waitRun
REM Delete lock file
del .r.lock > nul 2>&1
REM Wait one second if lock file exist
jbosssvc.exe -s 1
if exist ".r.lock" goto waitRun
echo Y > .r.lock
jbosssvc.exe -p 1 "Restarting %SVCDISP%" >> run.log
call run.bat < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
goto cmdEnd
:cmdSignal
REM Send signal to the service.
REM Requires jbosssch.dll to be loaded in JVM
@if not ""%2"" == """" goto execSignal
echo Missing signal parameter.
echo Usage: service signal [0...9]
goto cmdEnd
:execSignal
jbosssvc.exe -k%2 %SVCNAME%
goto cmdEnd
:cmdEnd
Other implementations were available from JBoss.
They were licensed under LGPL and so redistributable but there are not fully satisfying.
Tomcat Service Install/Uninstall Script
Using the Tomcat distribution of Nuxeo, you will find a service.bat
script in the bin
directory that could be adapted to install Nuxeo as a Windows service.
JavaServiceWrapper by Tanuki
Tanuki's library provides multiple methods for integrating a software as a service on various OS, the easier is to use the WrapperSimpleApp helper class to launch the application: see the example of JBoss installed as a Windows service.
It requires to unzip the downloaded wrapper file, configure a wrapper.conf
file pointing to %NUXEO_HOME%\bin\nuxeoctl.bat
, then write a wrapper.bat
file for managing test/install/uninstall:
REM Test:
wrapper.exe -c %NUXEO_HOME%\wrapper\wrapper.conf
REM Install:
wrapper.exe -i %NUXEO_HOME%\wrapper\wrapper.conf
REM Uninstall:
wrapper.exe -r %NUXEO_HOME%\wrapper\wrapper.conf
This solution is known to work well but is sadly not redistributable for us because of its GPL/Commercial license.
.NET InstallUtil
.NET framework provides an InstallUtil.exe
tool for installing/uninstalling services.
REM Install
InstallUtil /i %NUXEO_HOME\bin\service.bat
REM Uninstall
InstallUtil /u %NUXEO_HOME\bin\service.bat
There are some disadvantages such as failures in case of multiple frameworks installed and frontward/backward incompatibilities.
You may want to have a look at http://msdn2.microsoft.com/en-US/library/system.configuration.install.managedinstallerclass.aspx for managing that programmatically.