本文目錄
LibreNMS 監控 Windows 主機,最常用的是 SNMP,CPU、記憶體、磁碟、網路流量都拿得到。但如果要檢查「某個服務有沒有在跑」「某支程式開了幾個」,SNMP 就不太好用了。
這時候可以在 Windows 上裝 Nagios 的 NCPA(Nagios Cross-Platform Agent),再從 LibreNMS 用 check_ncpa.py 去查詢。NCPA 透過 HTTPS API 提供系統資訊,LibreNMS 的「服務」功能可以直接呼叫 Nagios 外掛,兩邊接起來就能監測服務與程序狀態。
這篇整理安裝、設定、測試到加進 LibreNMS 的完整流程,以及常用的查詢寫法。
與 NSClient++、NRPE 的差異
以前我在 Windows 上多半裝 NSClient++,Linux 上裝 NRPE(Nagios Remote Plugin Executor),監控端再用 check_nrpe 或 check_nt 去查。這兩套現在都還有人維護,但用起來有幾個不方便的地方:
- 檢查要先在受監測主機上定義:NRPE 的做法是在每台主機的
nrpe.cfg寫好指令,監控端只能呼叫定義好的名稱。要新增一項檢查、調整門檻,就得回到每台主機改設定檔。想讓監控端自己帶參數,要開dont_blame_nrpe,官方設定檔的註解也提醒這有安全風險 - 版本容易停在舊版:NSClient++ 在 2018 年的 0.5.2 之後,隔了好幾年才在 2023 年底出 0.6 預覽版,很多環境至今還跑著當年的舊版;2025 年起才又密集發佈新版。NRPE 用發行版的套件安裝也會落後,例如 Debian 12、Ubuntu 24.04 的套件是 4.1.0,上游已經是 4.2.0
- Windows 與 Linux 是兩套東西,設定方式、檢查指令都不一樣
NCPA 是 Nagios 官方的跨平台 Agent,Windows、Linux、macOS 都是同一套。它把系統資訊整理成 HTTPS 的 JSON API,受監測主機上不用預先定義檢查,監控端直接指定要查的路徑和門檻即可;新增一項檢查只要改 LibreNMS 這一邊。
環境與準備
| 項目 | 內容 |
|---|---|
| 受監測主機 | Windows 11,需要系統管理員權限,範例 IP 192.168.1.50 |
| 監控主機 | LibreNMS(Ubuntu/Debian),範例 IP 192.168.1.10 |
| NCPA | 本文查證時的最新版是 3.5.0(2026/09/08 發佈);實測環境是 Windows 11 Pro 由 3.1.1 升級到 3.5.0 |
| 連線 | LibreNMS 到 Windows 的 TCP 5693 |
文中的 API Token 一律寫成 your-token,請換成自己設定的值。
Windows 安裝 NCPA
下載與安裝
到 NCPA 官方網站的下載區下載 Windows 版。注意 NCPA 3.x 的 Windows 安裝檔是 .exe(NSIS 安裝程式),不是 MSI,檔名像 ncpa-3.5.0.exe。
以系統管理員身分執行,安裝過程會要求設定:
- Token:API 的認證字串,LibreNMS 查詢時要帶,請設定夠長的隨機字串
- Bind IP:預設
0.0.0.0,接受所有介面的連線 - Bind Port:預設
5693 - SSL Minimum:TLS 最低版本,可選
TLSv1_2或TLSv1_3,預設TLSv1_2 - Log Level:記錄等級
後面還有被動檢查(NRDP)的設定頁,只用主動查詢的話不用填。
全新安裝時,安裝程式會自動在 Windows 防火牆新增一條名為 NCPA 的規則,開放剛才設定的連接埠。升級安裝不會重建這條規則。
安裝完成後 NCPA 服務會自動啟動。
設定檔 ncpa.cfg
設定檔位置:
C:\Program Files\Nagios\NCPA\etc\ncpa.cfg
用系統管理員身分開啟記事本再編輯。另外 etc\ncpa.cfg.d\ 資料夾裡的 .cfg 檔也會被合併讀取,自訂設定放在這裡,升級時比較不會被覆蓋。
安裝時填的 Token 寫在 [api] 段:
[api]
community_string = your-token
監聽位址、連接埠、TLS 與允許連入的主機都在 [listener] 段:
[listener]
ip = 0.0.0.0
port = 5693
ssl_version = TLSv1_2
certificate = adhoc
allowed_hosts = 127.0.0.1, 192.168.1.10
allowed_hosts:允許存取 API 與網頁介面的來源,逗號分隔,可以寫 CIDR(例如192.168.1.0/24),不支援萬用字元。建議只開放監控主機certificate = adhoc:使用自動產生的自簽憑證。NCPA 的 API 一律走 HTTPSdisable_gui = 1:如果不需要 NCPA 自己的網頁介面,可以關掉,API 不受影響
注意:網路上不少舊教學寫的 [listeners]、ssl_enable、disable_auth 都不是 NCPA 3.x 的設定,寫了也不會生效。
重新啟動服務
修改設定後要重新啟動 NCPA。NCPA 3.x 只有一個服務,名稱就是 NCPA:
net stop ncpa
net start ncpa
也可以在 services.msc 找到 NCPA 服務重新啟動。舊版 2.x 的服務名稱是 ncpalistener、ncpapassive,3.x 已經合併成一個。
確認防火牆規則
安裝程式已經開好連接埠,可以用 PowerShell 確認:
Get-NetFirewallRule -DisplayName "NCPA" | Get-NetFirewallPortFilter
如果是升級安裝或規則被刪掉,可以手動補上,並限制只允許監控主機連入:
New-NetFirewallRule -DisplayName "NCPA" -Direction Inbound -Protocol TCP -LocalPort 5693 -RemoteAddress 192.168.1.10 -Action Allow
LibreNMS 主機安裝 check_ncpa
下載外掛
LibreNMS 的服務檢查使用 Nagios 外掛,預設目錄是 /usr/lib/nagios/plugins。還沒裝過外掛的話先裝官方套件:
sudo apt install monitoring-plugins
下載 check_ncpa.py,存成 check_ncpa(不加副檔名)並給執行權限:
sudo wget https://raw.githubusercontent.com/NagiosEnterprises/ncpa/master/client/check_ncpa.py -O /usr/lib/nagios/plugins/check_ncpa
sudo chmod +x /usr/lib/nagios/plugins/check_ncpa
存成 check_ncpa 的原因:LibreNMS 會把外掛目錄裡 check_ 開頭的檔案列成服務類型,並去掉 check_ 前綴。檔名是 check_ncpa 就會顯示成 ncpa;保留 .py 的話會顯示成 ncpa.py,一樣能用,只是名稱比較醜。
處理 python 路徑
check_ncpa.py 第一行是 #!/usr/bin/env python,而 Debian 12、Ubuntu 22.04 以後預設沒有 python 這個指令,只有 python3,執行會出現找不到 python。擇一處理:
# 方法一:安裝 python 指向 python3 的套件
sudo apt install python-is-python3
# 方法二:直接把外掛的第一行改成 python3
sudo sed -i '1s|python$|python3|' /usr/lib/nagios/plugins/check_ncpa
方法二在重新下載外掛後要再改一次。
另外,check_ncpa.py 只用 Python 標準函式庫,不需要另外安裝 requests 或其他 pip 套件。
確認版本
/usr/lib/nagios/plugins/check_ncpa -V
用指令測試
先在 LibreNMS 主機上手動測試,確認通了再加進 LibreNMS。最基本的是查開機時間:
/usr/lib/nagios/plugins/check_ncpa -H 192.168.1.50 -t 'your-token' -M 'system/uptime'
OK: Uptime is 5 days, 3 hours, 22 minutes | 'system.uptime'=432322
常用參數
| 參數 | 說明 |
|---|---|
-H | NCPA 主機的 IP 或名稱 |
-t | API Token |
-M | 要查詢的模組路徑,例如 system/uptime |
-q | 查詢條件,多個用逗號分隔,例如 service=wuauserv,status=running |
-w、-c | 警告、嚴重的門檻值 |
-P | 連接埠,預設 5693 |
-l | 列出該路徑下的完整內容(JSON),不做檢查 |
-T | 逾時秒數,預設 58(注意是大寫,小寫 -t 是 Token) |
-s | 要求驗證 HTTPS 憑證 |
-u | 單位前綴,例如 Gi、M,用在位元組類的數值 |
-d | 改成每秒變化量(delta),用在網路流量這類累計值 |
-S | 取樣秒數,用在 CPU、效能計數器 |
-a | 傳給自訂外掛的參數 |
check_ncpa.py 預設不驗證憑證,所以 NCPA 用自簽憑證(certificate = adhoc)也能直接連;換成正式憑證、想要確實驗證時才加 -s。網路上有些文章寫的 --ssl-no-verify 並不存在。
查看有哪些資料可以查
加上 -l 可以列出完整內容,先看清楚結構再決定要查哪個路徑:
# 列出 system 底下的所有資訊
/usr/lib/nagios/plugins/check_ncpa -H 192.168.1.50 -t 'your-token' -M 'system' -l
# 列出全部模組(內容很多,搭配 more)
/usr/lib/nagios/plugins/check_ncpa -H 192.168.1.50 -t 'your-token' -M '' -l | more
下面是對一台 Linux 主機(NCPA 3.1.1)執行 -M 'system' -l 的輸出,可以看出各欄位的格式:
{
"system": {
"node": "linux-01",
"machine": "x86_64",
"uptime": [203776.0, "s"],
"version": "#136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024",
"time": 1733911995.8899891,
"release": "5.15.0-126-generic",
"timezone": ["CST", "CST"],
"agent_version": "3.1.1",
"system": "Linux",
"processor": "x86_64"
}
}
內建模組用法
以下是 NCPA 內建模組的用法,輸出都是在 Windows 11 Pro、NCPA 3.5.0 上實測的結果。為了閱讀方便,指令省略了外掛路徑與共同參數,完整寫法是:
/usr/lib/nagios/plugins/check_ncpa -H 192.168.1.50 -t 'your-token' -M '模組路徑' ...
路徑裡的 \ 和 / 都要寫成 |,所以 C 槽是 C:|、Linux 的 /boot 是 |boot。各模組的完整參數請看 NCPA 的 API 說明,NCPA 本身也內建一份,在 https://主機:5693/help。
| 模組 | 內容 | 平台 |
|---|---|---|
cpu | CPU 使用率 | 全部 |
memory | 實體記憶體(virtual)與分頁檔(swap) | 全部 |
disk | 磁碟分割區(logical)、實體磁碟(physical)、掛接點(mount) | 全部 |
interface | 網路介面流量與封包 | 全部 |
services | 服務狀態 | 全部 |
processes | 程序數量與用量 | 全部 |
system | 主機名稱、作業系統、開機時間、NCPA 版本 | 全部 |
user | 已登入的使用者 | 全部 |
plugins | 執行自訂外掛 | 全部 |
logs | Windows 事件記錄 | Windows |
windowscounters | Windows 效能計數器 | Windows |
門檻值的寫法遵循 Nagios 外掛的規範:-w 80 是超過 80 警告;-w 20: 是低於 20 警告,適合剩餘空間這類「越少越糟」的數值。
CPU
cpu/percent 預設回傳每個核心各自的使用率,加上 aggregate=avg 取平均,可用 avg、min、max、sum:
-M 'cpu/percent' -q 'aggregate=avg' -w 80 -c 90
OK: Percent was 31.08 % | 'percent'=31.08%;80;90;
單次取樣容易抓到瞬間的高點,加上 -S 5 會取樣 5 秒再計算,數字比較穩定:
-M 'cpu/percent' -q 'aggregate=avg' -S 5 -w 80 -c 90
記憶體
memory/virtual 不指定項目時會合併成一筆,同時列出使用率、可用、總量;-u Gi 把單位換成 GiB:
-M 'memory/virtual' -u Gi
OK: Memory usage was 35.30 % (Available: 6.45 GiB, Total: 9.96 GiB, Free: 6.45 GiB, Used: 3.51 GiB) | 'available'=6.45GiB;;; 'total'=9.96GiB;;; 'percent'=35.30%;;; 'free'=6.45GiB;;; 'used'=3.51GiB;;;
要設門檻就指定 percent;分頁檔用 memory/swap:
-M 'memory/virtual/percent' -w 85 -c 95
-M 'memory/swap' -u Gi
磁碟
disk/logical/C:| 合併顯示使用率、已用、剩餘、總量,門檻值套在使用率上:
-M 'disk/logical/C:|' -u Gi -w 80 -c 90
OK: Used disk space was 63.30 % (Used: 81.59 GiB, Free: 47.34 GiB, Total: 128.93 GiB) | 'used'=81.59GiB;;; 'free'=47.34GiB;;; 'total'=128.93GiB;;;
大容量磁碟用百分比不準(2 TB 的 10% 還有 200 GB),可以改看剩餘空間,門檻寫成 20:、10:,低於 20 GiB 警告、低於 10 GiB 嚴重:
-M 'disk/logical/C:|/free' -u Gi -w 20: -c 10:
OK: Free was 47.34 GiB | 'free'=47.34GiB;20:;10:;
網路介面
先用 -l 查出介面名稱。中文版 Windows 的名稱是中文,例如「乙太網路」:
-M 'interface' -l
bytes_recv、bytes_sent 是開機以來的累計值,要看流量就加 -d(delta),NCPA 會算出和上一次查詢之間的每秒平均。第一次查詢沒有前一筆資料,結果會是 0,第二次之後才是實際值:
-M 'interface/乙太網路/bytes_recv' -d -u M -w 50 -c 100
OK: Bytes_recv was 0.01 MB/s | 'bytes_recv'=0.01;50;100;
服務
services 用 -q 指定服務名稱,是「服務名稱」欄位,不是顯示名稱(例如 Windows Update 是 wuauserv,可以在 services.msc 的服務內容裡看到)。不指定狀態時,預設檢查是否為執行中:
-M 'services' -q 'service=wuauserv'
CRITICAL: wuauserv is stopped (should be running)
要確認服務已停止,指定 status=stopped;一次檢查多個服務就重複寫 service=,任何一個不符合就是 CRITICAL:
-M 'services' -q 'service=wuauserv,status=stopped'
-M 'services' -q 'service=wuauserv,service=Spooler'
OK: wuauserv is stopped
CRITICAL: wuauserv is stopped (should be running), Spooler is running
服務名稱不確定時,加上 match=search 改成部分比對。
程序
確認某支程式有沒有在執行,門檻值套在程序數量上:
-M 'processes' -q 'name=svchost.exe' -w 150 -c 200
OK: Process count for processes named svchost.exe was 86 | 'process_count'=86;150;200; 'cpu'=2.73%;;; 'memory'=10.23%;;; ...
Processes Matched
PID: Name: Username: Exe: Memory: CPU
-----------------------------------
792: svchost.exe: NT AUTHORITY\SYSTEM: 0.09 % (VMS 0.00 GB, RSS 0.01 GB): 0.00 %
...
程序多的時候明細會非常長,加上 short_output=true 只顯示數量與總用量:
-M 'processes' -q 'name=explorer.exe,short_output=true'
OK: Process count for processes named explorer.exe was 1
Short output enabled, skipping process details.
Total Memory: 1.18 % (VMS 0.10 GB, RSS 0.13 GB)
Total CPU: 0.00 %
注意 short_output 在我測試的 NCPA 3.1.1 沒有作用,升級到 3.5.0 才生效。
name 預設是完全比對,加上 match=search 改成部分比對,例如 name=edge,match=search 會找到所有 msedge.exe、msedgewebview2.exe。其他條件還有 exe(執行檔路徑)、cmd(命令列)、username(執行帳號),多個條件預設要全部符合,combiner=or 改成任一符合。有些舊文章寫的 metric=count 不是有效的參數。
系統與使用者
-M 'system/agent_version'
-M 'system/uptime'
-M 'user/count' -w 3 -c 5
OK: Agent_version was 3.5.0 | 'agent_version'=3.5.0;;;
OK: Uptime was 15 hours 34 minutes | 'uptime'=56040.61s;;;
OK: Count was 1 users | 'count'=1;3;5;
system/agent_version 拿來確認每台的 NCPA 版本很方便;user/count 可以在不該有人登入的伺服器上,發現有人登入。
Windows 事件記錄
logs 模組要用 name 指定記錄名稱(System、Application、Security),logged_after 是往回看的時間(30m、24h、1d、1w),severity 篩選等級。門檻值套在筆數上,下面是「一天內 System 記錄有任何錯誤就警告、超過 5 筆嚴重」:
-M 'logs' -q 'name=System,severity=ERROR,logged_after=1d' -w 0 -c 5
CRITICAL: System has 6 logs, Total Count has 6 logs (Time range - last 1 day) | 'System'=6;0;5; 'Total Count'=6;0;5;
System Logs
Time: Computer: Severity: Event ID: Source: Category: Message
-------------------------------------------------------------
2026-10-25 22:58:35: WIN11-01: ERROR: 7000: Service Control Manager: 0: RustDesk Service 服務無法啟動,因為下列錯誤: %%2
還可以用 event_id、application(事件來源)精確比對,message 用關鍵字或正規表示式搜尋內容。例如只盯某個事件 ID 時,加上 event_id=7000。
Windows 效能計數器
windowscounters 可以讀取任何效能計數器,路徑就是計數器名稱。百分比與每秒類的計數器要加 -S 取樣一段時間,否則會是 0:
-M 'windowscounters/Processor(_Total)/% Processor Time' -S 5 -w 80 -c 90
-M 'windowscounters/TCPv4/Connections Established'
OK: \Processor(_Total)\% Processor Time was 21.32 % Processor Time | '\Processor(_Total)\% Processor Time'=21.32;80;90;
OK: \TCPv4\Connections Established was 17.00 Connections Established | '\TCPv4\Connections Established'=17.00;;;
中文版 Windows 上用英文計數器名稱也能查。可用的計數器可以在 Windows 上用 typeperf -q 列出。
自訂外掛:檢查檔案與資料夾
NCPA 沒有內建檢查檔案或資料夾的模組。這類需求要用自訂外掛:把指令稿放進外掛目錄,再由監控端呼叫。
外掛的放置與執行
外掛目錄在:
C:\Program Files\Nagios\NCPA\plugins\
NCPA 依副檔名決定執行方式,Windows 預設支援 .ps1、.bat、.vbs、.wsf。.ps1 是以 powershell -ExecutionPolicy Bypass -File 執行,不需要另外調整 Windows 的執行原則。外掛要照 Nagios 的慣例輸出一行結果,並回傳結束碼:0 OK、1 WARNING、2 CRITICAL、3 UNKNOWN。
放好之後用 -M 'plugins' -l 確認 NCPA 看得到:
-M 'plugins' -l
{
"plugins": [
"check_file_count.bat",
"check_files.ps1"
]
}
check_files.ps1
我寫了一支通用的檢查指令稿,可以確認檔案或資料夾是否存在、檔案數量是否在範圍內,以及最新的檔案是不是太久沒更新:
# check_files.ps1 : NCPA plugin, checks that a file/folder exists and how many items it holds
# Exit codes follow Nagios: 0 OK, 1 WARNING, 2 CRITICAL, 3 UNKNOWN
param(
[Parameter(Mandatory = $true)][string]$Path, # file or folder
[string]$Filter = '*', # wildcard used for counting, e.g. *.bak
[int]$MinCount = -1, # CRITICAL when fewer items than this
[int]$MaxCount = -1, # CRITICAL when more items than this
[int]$MaxAgeHours = -1, # CRITICAL when the newest item is older than this
[switch]$Recurse # include subfolders when counting
)
try {
if (-not (Test-Path -LiteralPath $Path)) {
Write-Output "CRITICAL: $Path not found"
exit 2
}
# Only an existence check
if ($MinCount -lt 0 -and $MaxCount -lt 0 -and $MaxAgeHours -lt 0) {
Write-Output "OK: $Path exists"
exit 0
}
$items = @(Get-ChildItem -LiteralPath $Path -Filter $Filter -File -Recurse:$Recurse -ErrorAction Stop)
$count = $items.Count
$perf = "| 'count'=$count;;;"
$problems = @()
if ($MinCount -ge 0 -and $count -lt $MinCount) { $problems += "expected at least $MinCount" }
if ($MaxCount -ge 0 -and $count -gt $MaxCount) { $problems += "expected at most $MaxCount" }
if ($MaxAgeHours -ge 0) {
if ($count -eq 0) {
$problems += "no file to check age"
} else {
$newest = ($items | Sort-Object LastWriteTime -Descending | Select-Object -First 1)
$age = [math]::Round(((Get-Date) - $newest.LastWriteTime).TotalHours, 1)
if ($age -gt $MaxAgeHours) { $problems += "newest file $($newest.Name) is $age hours old" }
}
}
if ($problems.Count -gt 0) {
Write-Output "CRITICAL: $count file(s) matching $Filter in $Path, $($problems -join ', ') $perf"
exit 2
}
Write-Output "OK: $count file(s) matching $Filter in $Path $perf"
exit 0
}
catch {
Write-Output "UNKNOWN: $($_.Exception.Message)"
exit 3
}
| 參數 | 說明 |
|---|---|
-Path | 要檢查的檔案或資料夾(必填) |
-Filter | 計數時的篩選,例如 *.bak,預設全部 |
-MinCount | 檔案數少於這個值就 CRITICAL |
-MaxCount | 檔案數多於這個值就 CRITICAL |
-MaxAgeHours | 最新的檔案超過這個時數沒更新就 CRITICAL |
-Recurse | 計數時包含子資料夾 |
只給 -Path 就是單純檢查存在與否。
呼叫方式與實測結果
外掛的參數用 -a 帶入,整串用引號包起來:
# 是否存在
-M 'plugins/check_files.ps1' -a '-Path D:\Backup'
# .bak 至少要有 3 個
-M 'plugins/check_files.ps1' -a '-Path D:\Backup -Filter *.bak -MinCount 3'
# 待處理的資料夾應該是空的,有檔案就告警
-M 'plugins/check_files.ps1' -a '-Path D:\Inbox -MaxCount 0'
# 最新的備份檔不能超過 24 小時
-M 'plugins/check_files.ps1' -a '-Path D:\Backup -Filter *.bak -MaxAgeHours 24'
在測試主機建立一個放了 3 個 .bak(分別是 50、26、2 小時前)與 1 個 .txt 的資料夾,實測結果:
OK: C:\ncpa-test\Backup exists
CRITICAL: C:\ncpa-test\Nothing not found
OK: 3 file(s) matching *.bak in C:\ncpa-test\Backup | 'count'=3;;;
CRITICAL: 3 file(s) matching *.bak in C:\ncpa-test\Backup, expected at least 5 | 'count'=3;;;
OK: 0 file(s) matching * in C:\ncpa-test\Inbox | 'count'=0;;;
CRITICAL: 4 file(s) matching * in C:\ncpa-test\Backup, expected at most 2 | 'count'=4;;;
OK: 3 file(s) matching *.bak in C:\ncpa-test\Backup | 'count'=3;;;
CRITICAL: 3 file(s) matching *.bak in C:\ncpa-test\Backup, newest file db-3.bak is 2 hours old | 'count'=3;;;
最後一行是 -MaxAgeHours 1:最新的檔案是 2 小時前,超過 1 小時所以 CRITICAL。結束碼也確認過,CRITICAL 時 check_ncpa 回傳 2,LibreNMS 就是依這個判斷狀態。
參數也可以用 NCPA 官方文件的 args 寫法傳,效果相同:
-M 'plugins/check_files.ps1' -q 'args=-Path D:\Backup,args=-Filter *.bak,args=-MinCount 3'
注意:路徑不要有空白。check_ncpa 與 NCPA 都會依空白切開參數,路徑含空白容易被切斷。
常見的使用情境
- 備份有沒有產生:備份資料夾的
.bak、.zip數量下限,加上最新檔案不超過 24 小時 - 佇列有沒有堆積:掃描、傳真、EDI 匯入這類「處理完就移走」的資料夾,用
-MaxCount設上限,或直接-MaxCount 0 - 重要檔案還在不在:授權檔、設定檔只檢查存在與否
- 記錄檔有沒有在寫:記錄資料夾的最新檔案不超過幾小時,太久沒更新代表程式可能停了
.bat 也可以當外掛。例如下面這支只用 dir 計數,資料夾有檔案就 CRITICAL,適合沒辦法用 PowerShell 的環境:
@echo off
setlocal enabledelayedexpansion
set "DIR=%~1"
if not exist "%DIR%" (
echo CRITICAL - directory "%DIR%" does not exist or cannot be accessed
exit /b 2
)
for /f %%A in ('dir /b /a-d /s "%DIR%" 2^>nul ^| find /c /v ""') do set "COUNT=%%A"
if "%COUNT%"=="0" (
echo OK - no files in "%DIR%"
exit /b 0
) else (
echo CRITICAL - %COUNT% files found in "%DIR%"
exit /b 2
)
-M 'plugins/check_file_count.bat' -a 'D:\Inbox'
OK - no files in "C:\ncpa-test\Inbox"
加進 LibreNMS 服務
啟用服務功能
LibreNMS 的「服務」預設沒有開啟,先啟用:
lnms config:set show_services true
也可以在 config.php 加上 $config['show_services'] = 1;。啟用後導覽列會多出「Services」選單。
新增服務
到裝置頁面選「Services」,按「Add Service」:
- Check Type:選
ncpa(就是剛才的check_ncpa) - Remote Host:留空會用裝置本身的位址
- Parameters:填
-H以外的參數
LibreNMS 執行時會自己組出 check_ncpa -H <主機> <Parameters>,所以 Parameters 不要再寫 -H。例如檢查 Windows Update 服務:
-t 'your-token' -M 'services' -q 'service=wuauserv'
檢查 C 槽使用率:
-t 'your-token' -M 'disk/logical/C:|/used_percent' -w 80 -c 90
前面用指令測試過的寫法,拿掉 -H 那一段就能直接貼進 Parameters。
自訂外掛也一樣,例如檢查最新的備份檔不超過 24 小時:
-t 'your-token' -M 'plugins/check_files.ps1' -a '-Path D:\Backup -Filter *.bak -MaxAgeHours 24'
實際使用畫面
下面是我在 LibreNMS 上監測一台 Zimbra 郵件主機的服務清單(這台是 Linux,NCPA 的用法和 Windows 相同)。HTTP、SMTP、IMAP、POP3、憑證效期用 LibreNMS 內建的外掛檢查,Zimbra 內部的 LDAP、mailbox、MySQL、MTA 則用 ncpa 檢查對應的程序(slapd、java、mysqld)有沒有在執行:

程序檢查預設會列出每個符合的程序明細,畫面上會很長。查詢條件加上 short_output=true 只顯示數量與總用量,就是圖中「Short output enabled」的效果:
-t 'your-token' -M 'processes' -q 'name=slapd,short_output=true'
常見問題
連不到 NCPA
- 確認防火牆規則存在,而且允許監控主機的來源 IP
- 確認
allowed_hosts有包含 LibreNMS 主機的 IP,改完要重新啟動 NCPA 服務 - 確認 NCPA 服務在執行:
net start ncpa - 從 LibreNMS 主機測試連接埠:
curl -k https://192.168.1.50:5693/
Token 錯誤
確認 -t 帶的值與 ncpa.cfg 的 [api] community_string 一致。改過設定檔要重新啟動服務才會生效。
找不到 python
外掛第一行是 python,依前面「處理 python 路徑」安裝 python-is-python3 或改成 python3。
憑證錯誤
check_ncpa.py 預設不驗證憑證,出現憑證錯誤通常是加了 -s。使用自簽憑證時不要加 -s。
服務檢查結果不對
確認用的是服務名稱而不是顯示名稱,大小寫也要一致。
結論
SNMP 適合看資源用量的趨勢,NCPA 則補上「服務有沒有在跑」「程式開了幾個」「事件記錄有沒有錯誤」這類狀態檢查。內建模組不夠用時,把 PowerShell 指令稿放進外掛目錄就能擴充,檢查備份檔、佇列資料夾這類需求都能做到,而且新增檢查只要改 LibreNMS 這一邊。
整理這篇時對照了 NCPA 3.5.0 的原始碼與說明,並在 Windows 11 上實際升級、逐項測試。網路上流傳的設定寫法有不少是舊版或根本不存在的參數,設定前建議先用 -l 看實際的資料結構,再用指令測試確認。
參考資料
- NCPA 官方網站與下載
https://www.nagios.org/ncpa/ - NCPA 3.x 設定說明
https://www.nagios.org/ncpa/help/3.x/configuration.html - NCPA 3.x API 說明
https://www.nagios.org/ncpa/help/3.x/api.html - NCPA 3.x 主動檢查說明
https://www.nagios.org/ncpa/help/3.x/active.html - NSClient++ GitHub
https://github.com/mickem/nscp - NRPE GitHub
https://github.com/NagiosEnterprises/nrpe - NCPA GitHub
https://github.com/NagiosEnterprises/ncpa - LibreNMS:Services
https://docs.librenms.org/Extensions/Services/



