Installing Nuxeo as a Windows service is independent of Nuxeo 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.
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.
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 Nuxeo "<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.
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).
- Download the latest stable version of YAJSW and unzip the archive.
- Set the system environment variable
NUXEO_CONFto the location of your
nuxeo.conffile, something like
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
genConfigcommand with the process ID as parameter:
The configuration is written in the file
%YAJSW_HOME%\conf\wrapper.conf.Wrapper Static Configuration Vs nuxeo.conf
Once 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.confafter 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_OPTSvariable: 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 (
Stop the Nuxeo Platform.
nuxeoctl.bat --gui=false stop
- at the end of the file, add a new line among the additional java options to set the
nuxeo.homeenvironment property. In the example below, Nuxeo is installed in
E:\Nuxeoand the new line is the 10th wrapper additional option:
wrapper.java.additional.10 = -Dnuxeo.home=E:\\\\Applis\\\\Nuxeo
- make sure the
wrapper.console.titleentry does not contain a colon (":") or the
runConsole.batexecution 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:
Check your application is accessible.
Edit the file
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
With the two above values set, the service would restart every time a server error occurs.
Install the application as a service:
Your service is installed and you can run the Nuxeo Platform from its service ("Windows Computer Management > Services" on Windows 7).
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
@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.
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.
Previous versions of the Tomcat distribution of Nuxeo came with a
service.bat script in the
bin directory that could be adapted to install Nuxeo as a Windows service.
.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.