Skip to content

Windows Services

This guide covers configuring License Monitor to run as a Windows service using NSSM (Non-Sucking Service Manager).

  • Windows 10/11 or Windows Server 2016+
  • Administrator access
  • License Monitor binary installed
  • NSSM (Non-Sucking Service Manager)
  1. Download NSSM

    Download from the official website: https://nssm.cc/download

    Or use a package manager:

    Terminal window
    choco install nssm
  2. Add to PATH (if manually installed)

    Terminal window
    [Environment]::SetEnvironmentVariable(
    "Path",
    $env:Path + ";C:\Program Files\nssm\win64",
    [EnvironmentVariableTarget]::Machine
    )
  1. Create installation directory

    Terminal window
    # Create directories
    New-Item -ItemType Directory -Path "C:\Program Files\LicenseMonitor" -Force
    New-Item -ItemType Directory -Path "C:\Program Files\LicenseMonitor\logs" -Force
    New-Item -ItemType Directory -Path "C:\Program Files\LicenseMonitor\config" -Force
  2. Download the binary

    Terminal window
    # Download latest release
    Invoke-WebRequest `
    -Uri "https://github.com/keithce/license_monitor/releases/latest/download/license_monitor-windows-x86_64.exe" `
    -OutFile "C:\Program Files\LicenseMonitor\license_monitor.exe"
  3. Create configuration file

    Terminal window
    @"
    # License Monitor Configuration
    [command_mode]
    command = "lmutil lmstat -a"
    interval_seconds = 300
    [api]
    enabled = true
    bind_address = "127.0.0.1"
    bind_port = 8080
    allow_public_bind = false
    rate_limit_requests = 100
    rate_limit_window_seconds = 60
    [daemon]
    log_file = "C:\\Program Files\\LicenseMonitor\\logs\\license_monitor.log"
    log_level = "warn"
    [update]
    channel = "stable"
    auto_check = false
    "@ | Out-File -FilePath "C:\Program Files\LicenseMonitor\config\config.toml" -Encoding UTF8
  4. Verify installation

    Terminal window
    & "C:\Program Files\LicenseMonitor\license_monitor.exe" --version
  1. Install the service with NSSM

    Terminal window
    # Open NSSM GUI
    nssm install LicenseMonitor
    # Or install directly from command line
    nssm install LicenseMonitor "C:\Program Files\LicenseMonitor\license_monitor.exe"
  2. Configure service parameters

    Using the GUI, configure:

    TabSettingValue
    ApplicationPathC:\Program Files\LicenseMonitor\license_monitor.exe
    ApplicationStartup directoryC:\Program Files\LicenseMonitor
    ApplicationArguments--config "C:\Program Files\LicenseMonitor\config\config.toml" --mode command --daemon
    DetailsDisplay nameLicense Monitor Service
    DetailsDescriptionMonitors license server usage and provides API access
    DetailsStartup typeAutomatic
    Log onLog on asLocal System (or dedicated service account)
    I/OOutput (stdout)C:\Program Files\LicenseMonitor\logs\stdout.log
    I/OError (stderr)C:\Program Files\LicenseMonitor\logs\stderr.log
    Exit actionsRestart delay10000 ms
    Exit actionsDefault actionRestart

    Or configure via command line:

    Terminal window
    nssm set LicenseMonitor Application "C:\Program Files\LicenseMonitor\license_monitor.exe"
    nssm set LicenseMonitor AppDirectory "C:\Program Files\LicenseMonitor"
    nssm set LicenseMonitor AppParameters '--config "C:\Program Files\LicenseMonitor\config\config.toml" --mode command --daemon'
    nssm set LicenseMonitor DisplayName "License Monitor Service"
    nssm set LicenseMonitor Description "Monitors license server usage and provides API access"
    nssm set LicenseMonitor Start SERVICE_AUTO_START
    nssm set LicenseMonitor AppStdout "C:\Program Files\LicenseMonitor\logs\stdout.log"
    nssm set LicenseMonitor AppStderr "C:\Program Files\LicenseMonitor\logs\stderr.log"
    nssm set LicenseMonitor AppStdoutCreationDisposition 4
    nssm set LicenseMonitor AppStderrCreationDisposition 4
    nssm set LicenseMonitor AppRotateFiles 1
    nssm set LicenseMonitor AppRotateSeconds 86400
    nssm set LicenseMonitor AppRotateBytes 10485760
    nssm set LicenseMonitor AppExit Default Restart
    nssm set LicenseMonitor AppRestartDelay 10000
  3. Start the service

    Terminal window
    nssm start LicenseMonitor
Terminal window
# Start service
nssm start LicenseMonitor
# or
Start-Service LicenseMonitor
# Stop service
nssm stop LicenseMonitor
# or
Stop-Service LicenseMonitor
# Restart service
nssm restart LicenseMonitor
# or
Restart-Service LicenseMonitor
# Check status
nssm status LicenseMonitor
# or
Get-Service LicenseMonitor
# View service configuration
nssm dump LicenseMonitor
Terminal window
# Detailed status
Get-Service LicenseMonitor | Format-List *
# Check if running
(Get-Service LicenseMonitor).Status
Terminal window
# View application log
Get-Content "C:\Program Files\LicenseMonitor\logs\license_monitor.log" -Tail 50
# Follow log in real-time
Get-Content "C:\Program Files\LicenseMonitor\logs\license_monitor.log" -Wait
# View Windows Event Log
Get-EventLog -LogName Application -Source nssm -Newest 20

NSSM can handle log rotation automatically:

Terminal window
# Enable rotation
nssm set LicenseMonitor AppRotateFiles 1
# Rotate daily
nssm set LicenseMonitor AppRotateSeconds 86400
# Rotate at 10MB
nssm set LicenseMonitor AppRotateBytes 10485760
# Keep rotated files (append date)
nssm set LicenseMonitor AppRotateOnline 1

To run multiple License Monitor instances:

  1. Create instance directories

    Terminal window
    New-Item -ItemType Directory -Path "C:\Program Files\LicenseMonitor\instances\flexlm" -Force
    New-Item -ItemType Directory -Path "C:\Program Files\LicenseMonitor\instances\rlm" -Force
  2. Create instance configurations

    Terminal window
    # FlexLM configuration
    @"
    [command_mode]
    command = "lmutil lmstat -a -c 27000@flexlm-server"
    interval_seconds = 300
    [api]
    enabled = true
    bind_address = "127.0.0.1"
    bind_port = 8081
    [daemon]
    log_file = "C:\\Program Files\\LicenseMonitor\\instances\\flexlm\\logs\\license_monitor.log"
    log_level = "warn"
    "@ | Out-File "C:\Program Files\LicenseMonitor\instances\flexlm\config.toml" -Encoding UTF8
    # RLM configuration
    @"
    [command_mode]
    command = "rlmstat -a -c 5053@rlm-server"
    interval_seconds = 300
    [api]
    enabled = true
    bind_address = "127.0.0.1"
    bind_port = 8082
    [daemon]
    log_file = "C:\\Program Files\\LicenseMonitor\\instances\\rlm\\logs\\license_monitor.log"
    log_level = "warn"
    "@ | Out-File "C:\Program Files\LicenseMonitor\instances\rlm\config.toml" -Encoding UTF8
  3. Install services

    Terminal window
    # FlexLM service
    nssm install LicenseMonitor-FlexLM "C:\Program Files\LicenseMonitor\license_monitor.exe"
    nssm set LicenseMonitor-FlexLM AppParameters '--config "C:\Program Files\LicenseMonitor\instances\flexlm\config.toml" --daemon'
    nssm set LicenseMonitor-FlexLM DisplayName "License Monitor - FlexLM"
    # RLM service
    nssm install LicenseMonitor-RLM "C:\Program Files\LicenseMonitor\license_monitor.exe"
    nssm set LicenseMonitor-RLM AppParameters '--config "C:\Program Files\LicenseMonitor\instances\rlm\config.toml" --daemon'
    nssm set LicenseMonitor-RLM DisplayName "License Monitor - RLM"
    # Start services
    nssm start LicenseMonitor-FlexLM
    nssm start LicenseMonitor-RLM
Terminal window
# Allow License Monitor API port
New-NetFirewallRule `
-DisplayName "License Monitor API" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8080 `
-Action Allow `
-Profile Domain,Private
# For multiple instances
New-NetFirewallRule -DisplayName "License Monitor FlexLM" -Direction Inbound -Protocol TCP -LocalPort 8081 -Action Allow
New-NetFirewallRule -DisplayName "License Monitor RLM" -Direction Inbound -Protocol TCP -LocalPort 8082 -Action Allow

Using Services MMC or PowerShell:

Terminal window
# Set recovery options via sc.exe
sc.exe failure LicenseMonitor reset= 86400 actions= restart/10000/restart/10000/restart/10000

This configures:

  • First failure: Restart after 10 seconds
  • Second failure: Restart after 10 seconds
  • Subsequent failures: Restart after 10 seconds
  • Reset failure count after 1 day
Terminal window
# Create local service account
$Password = Read-Host -AsSecureString "Enter password"
New-LocalUser -Name "LicenseMonitorSvc" -Password $Password -Description "License Monitor Service Account"
# Grant Log on as a service right (via Local Security Policy or Group Policy)
Terminal window
nssm set LicenseMonitor ObjectName ".\LicenseMonitorSvc" "password"
Terminal window
# Check NSSM status
nssm status LicenseMonitor
# View Windows Event Log
Get-EventLog -LogName Application -Source nssm -Newest 10
# Test configuration manually
& "C:\Program Files\LicenseMonitor\license_monitor.exe" --config "C:\Program Files\LicenseMonitor\config\config.toml" --debug
Terminal window
# Check file permissions
Get-Acl "C:\Program Files\LicenseMonitor" | Format-List
# Grant permissions to service account
$acl = Get-Acl "C:\Program Files\LicenseMonitor\logs"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("LicenseMonitorSvc", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($rule)
Set-Acl "C:\Program Files\LicenseMonitor\logs" $acl
Terminal window
# Stop and remove service
nssm stop LicenseMonitor
nssm remove LicenseMonitor confirm