Naemon 1.5 常用 CLI 命令与工具详解

逐项实测讲解 Naemon 1.5.2 命令行工具箱:naemon 主程序校验/预缓存/计时启动、naemon-ctl 启停、naemonstats 运行统计与 MRTG 输出、unixcat 查询 Livestatus、外部命令文件、日志检索与插件本地调试,全部命令附真实回显。

NaemonNaemon运维Linux2026/11/01

Naemon 1.5 常用 CLI 命令与工具详解

目标:在 Ubuntu 22.04 服务器上系统讲解 Naemon 1.5.2 的命令行工具箱:naemon 主程序(配置校验、对象预缓存、计时启动、守护与 worker 模式)、naemon-ctl 启停包装、naemonstats 运行统计、unixcat 命令行查询 Livestatus、外部命令文件、日志检索与插件本地调试,每个参数与命令均附真实回显。全部命令与回显均在真实服务器上执行采集。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(amd64)
  • Naemon Core:1.5.2(naemon-core 1.5.2-1,OBS home:naemon 仓库安装,安装过程见本专栏部署篇《Ubuntu 22.04 安装 Naemon 1.5 指南》)
  • 配套组件:naemon-livestatus 1.5.1、monitoring-plugins 2.3.1
  • 服务管理:systemd(naemon.service)
  • 运行身份:核心进程以 naemon 用户运行;外部命令写入、日志检索等管理操作以 root 执行

二、工具概览

Naemon 装机后提供 4 个命令行二进制,加上插件目录中的数十个 check_* 检查程序构成完整工具链。先确认二进制与包的归属:

dpkg -L naemon-core naemon-livestatus | grep -E '/(usr/)?s?bin/' | sort -u

实测回显:

/usr/bin/naemon
/usr/bin/naemon-ctl
/usr/bin/naemonstats
/usr/bin/unixcat

工具总览:

工具路径所属包用途
naemon/usr/bin/naemonnaemon-core监控核心主程序:配置校验、对象预缓存、计时启动、守护/worker 模式
naemon-ctl/usr/bin/naemon-ctlnaemon-coreSysVinit 风格启停包装(start/stop/status/reload/configtest 等)
naemonstats/usr/bin/naemonstatsnaemon-core读取 status.dat 输出运行统计(人读/MRTG 两种格式)
unixcat/usr/bin/unixcatnaemon-livestatusLivestatus unix socket 命令行客户端
check_*$USER1$ 目录monitoring-plugins各类检查插件,可脱离调度器单独调试

插件宏路径定义在 /etc/naemon/resource.cfg,包将 /usr/lib/naemon/plugins 软链到发行版插件目录 /usr/lib/nagios/plugins:

grep '\$USER1\$=' /etc/naemon/resource.cfg
ls -l /usr/lib/naemon/

实测回显:

$USER1$=/usr/lib/naemon/plugins
total 8
drwxr-xr-x 2 root root 4096 Nov  1 04:22 naemon-livestatus
drwxr-xr-x 2 root root 4096 Nov  1 04:22 naemon-vimvault
lrwxrwxrwx 1 root root   17 May 18 14:48 plugins -> ../nagios/plugins

三、前置条件

  1. Naemon 已安装且服务运行中:systemctl is-active naemon 返回 active;
  2. 配置校验类命令(naemon -v 等)必须以 naemon 用户执行,root 会被直接拒绝(原因与解法见 4.1);
  3. 使用 unixcat 前需确认 naemon-livestatus 模块已按主配置加载(broker_module 配置见本专栏《Naemon 1.5 配置参数详解》5.8 节);
  4. 外部命令写入与日志检索需 root 权限(目标分别是 /var/lib/naemon/naemon.cmd 与 /var/log/naemon/naemon.log)。

四、各工具详解

4.1 naemon:核心主程序

先看完整帮助,后面逐项展开:

naemon --help

实测回显:

Usage: naemon [options] <main_config_file>

Options:

  -v, --verify-config          Verify all configuration data (-v -v for more info)
  -T, --enable-timing-point    Enable timed commentary on initialization
  -x, --dont-verify-paths      Deprecated (Don't check for circular object paths)
  -p, --precache-objects       Precache object configuration
  -u, --use-precached-objects  Use precached object config file
  -d, --daemon                 Starts Naemon in daemon mode, instead of as a foreground process
  -W, --worker /path/to/socket Act as a worker for an already running daemon
  --allow-root                 Let naemon run as root. THIS IS NOT RECOMMENDED AT ALL.

  -h, --help                   Print this help and exit
  -V, --version                Print the version and exit
  -L, --license                Print the license and exit

Visit the Naemon website at https://www.naemon.io/ for bug fixes, new
releases, online documentation, FAQs and more...

(1)版本与许可:-V / --version、-L / --license

naemon --version

实测回显:

Naemon Core 1.5.2

naemon -L 输出 GPL-2.0 许可声明,节选:

Copyright (c) 2013-present Naemon Core Development Team and Community Contributors
Copyright (c) 2009-2013 Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
License: GPLv2

(2)配置预检:-v / --verify-config

直接以 root 执行会被拒绝:

naemon -v /etc/naemon/naemon.cfg

实测回显(退出码 1):

ERROR: do not start naemon as root user.

正确姿势是切换到 naemon 用户执行:

su -s /bin/bash naemon -c "naemon -v /etc/naemon/naemon.cfg"

实测回显(尾部,退出码 0):

Checking global event handlers...
Checking global notification handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...

Total Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

(3)root 应急开关:--allow-root

naemon --allow-root -v /etc/naemon/naemon.cfg

实测回显(头部):

WARNING: you are running as root which is not recommended.
Reading configuration data...
   Read main config file okay...
   Read object config files okay...

该开关仅建议临时应急,预检通过后仍应回到 naemon 用户或 systemd 托管方式运行。

(4)双重校验:-v -v

加第二个 -v 会额外打印对象配置文件的加载清单,用于排查"哪个文件引入了坏对象":

su -s /bin/bash naemon -c "naemon -v -v /etc/naemon/naemon.cfg"

实测回显(头部):

Reading configuration data...
   Read main config file okay...
Processing object config directory '/etc/naemon/conf.d'...
Processing object config file '/etc/naemon/conf.d/commands.cfg'...
Processing object config file '/etc/naemon/conf.d/contacts.cfg'...
Processing object config directory '/etc/naemon/conf.d/templates'...
Processing object config file '/etc/naemon/conf.d/templates/services.cfg'...
Processing object config file '/etc/naemon/conf.d/templates/contacts.cfg'...
Processing object config file '/etc/naemon/conf.d/templates/hosts.cfg'...
Processing object config file '/etc/naemon/conf.d/localhost.cfg'...
Processing object config file '/etc/naemon/conf.d/thruk_templates.cfg'...
Processing object config file '/etc/naemon/conf.d/timeperiods.cfg'...
   Read object config files okay...

(5)计时点:-T / --enable-timing-point

在初始化各阶段打印耗时注释行,常与 -v 组合定位启动慢的环节:

su -s /bin/bash naemon -c "naemon -T -v -u /etc/naemon/naemon.cfg"

实测回显(计时行,节选):

[0.0000 (+0.0000)] Reading config data from '/etc/naemon/naemon.cfg'
[0.0003 (+0.0003)] Done parsing config files
[0.0003 (+0.0000)] Done recombobulating contactgroups
[0.0003 (+0.0000)] Done recombobulating hostgroups
[0.0003 (+0.0000)] Done recombobulating servicegroups
[0.0003 (+0.0000)] 0 unique / 0 total servicedependencies registered
[0.0003 (+0.0000)] 0 serviceescalations registered
[0.0003 (+0.0000)] 0 unique / 0 total hostdependencies registered
[0.0003 (+0.0000)] 0 hostescalations registered
   Read object config files okay...

预检结束与退出阶段同样有计时行:

[0.0004 (+0.0001)] Cleaning up
[0.0004 (+0.0000)] Exiting

注意上例使用了 -u(使用预缓存对象),因此首次使用前必须先执行 -p 生成缓存,见下节。

(6)对象预缓存:-p / --precache-objects 与 -u / --use-precached-objects

-p 把全部对象定义解析并序列化到 precached_object_file 指向的文件,-u 让后续启动/校验直接读缓存,跳过逐文件解析,对象数量大时能明显缩短启动时间:

su -s /bin/bash naemon -c "naemon -p /etc/naemon/naemon.cfg"
ls -l /var/lib/naemon/objects.precache

实测回显:

Object precache file created:
/var/lib/naemon/objects.precache
-rw-rw-r-- 1 naemon naemon 12994 Nov  1 04:47 /var/lib/naemon/objects.precache

对象配置一旦变更必须重新执行 -p,否则 -u 使用的仍是旧缓存(见五、注意事项)。

(7)守护模式:-d / --daemon 与 worker 模式:-W / --worker

-d 让 naemon 脱离前台转入后台守护运行;systemd 托管场景下服务单元已负责进程管理,请勿再手动用 -d 启动第二个实例。-W 则把当前进程变成一个 worker(检查执行进程),连接到主守护进程的 query handler socket。主守护进程的 socket 位于 /var/lib/naemon/naemon.qh:

ls -l /var/lib/naemon/naemon.qh

实测回显:

srw-rw---- 1 naemon naemon 0 Nov  1 04:39 /var/lib/naemon/naemon.qh

日常运维通过 systemctl restart naemon 或 naemon-ctl(4.2 节)重载即可,无需直接操作 -d/-W。

4.2 naemon-ctl:启停包装

naemon-ctl 是随包提供的 SysVinit 风格包装脚本,动作集固定:

naemon-ctl --help

实测回显:

Usage: /usr/bin/naemon-ctl {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}

两个高频动作实测:

naemon-ctl status

实测回显:

 * naemon is running
naemon-ctl configtest

实测回显(尾部,内部即执行一次完整预检):

Checking misc settings...

Total Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

Ubuntu 22.04 上服务由 systemd 托管(naemon.service),优先使用 systemctl;naemon-ctl 适合脚本场景与习惯 SysV 动词的运维,两者操作的是同一个 naemon 进程。

4.3 naemonstats:运行统计

naemonstats 读取 status.dat(状态文件路径由主配置 status_file 参数决定,刷新节奏由 status_update_interval 控制,见本专栏配置参数详解篇)输出统计。

naemonstats

实测回显:


Naemon Stats 1.5.2
Copyright (c) 2013-present Naemon Development Team (www.naemon.io)
Copyright (c) 2003-2008 Ethan Galstad (www.nagios.org)
License: GPL

CURRENT STATUS DATA
------------------------------------------------------
Status File:                            /var/lib/naemon/status.dat
Status File Age:                        0d 0h 0m 6s
Status File Version:                    1.5.2

Program Running Time:                   0d 0h 7m 46s
Naemon PID:                             11039

Total Services:                         8
Services Checked:                       8
Services Scheduled:                     8
Services Actively Checked:              8
Services Passively Checked:             0
Total Service State Change:             0.000 / 5.860 / 0.733 %
Active Service Latency:                 0.000 / 0.001 / 0.000 sec
Active Service Execution Time:          0.001 / 4.093 / 0.513 sec
Active Service State Change:            0.000 / 5.860 / 0.733 %
Active Services Last 1/5/15/60 min:     3 / 8 / 8 / 8
Passive Service Latency:                0.000 / 0.000 / 0.000 sec
Passive Service State Change:           0.000 / 0.000 / 0.000 %
Passive Services Last 1/5/15/60 min:    0 / 0 / 0 / 0
Services Ok/Warn/Unk/Crit:              7 / 0 / 0 / 1
Services Flapping:                      0
Services In Downtime:                   0

Total Hosts:                            1
Hosts Checked:                          1
Hosts Scheduled:                        1
Hosts Actively Checked:                 1
Host Passively Checked:                 0
Total Host State Change:                0.000 / 0.000 / 0.000 %
Active Host Latency:                    0.001 / 0.001 / 0.001 sec
Active Host Execution Time:             4.108 / 4.108 / 4.108 sec
Active Host State Change:               0.000 / 0.000 / 0.000 %
Active Hosts Last 1/5/15/60 min:        1 / 1 / 1 / 1
Passive Host Latency:                   0.000 / 0.000 / 0.000 sec
Passive Host State Change:              0.000 / 0.000 / 0.000 %
Passive Hosts Last 1/5/15/60 min:       0 / 0 / 0 / 0
Hosts Up/Down/Unreach:                  1 / 0 / 0
Hosts Flapping:                         0
Hosts In Downtime:                      0

Active Host Checks Last 1/5/15 min:     1 / 1 / 2
   Scheduled:                           1 / 1 / 2
   On-demand:                           0 / 0 / 0
   Parallel:                            1 / 1 / 2
   Serial:                               0 / 0 / 0
   Cached:                              0 / 0 / 0
Passive Host Checks Last 1/5/15 min:    0 / 0 / 0
Active Service Checks Last 1/5/15 min:  2 / 9 / 16
   Scheduled:                           2 / 9 / 16
   On-demand:                           0 / 0 / 0
   Cached:                              0 / 0 / 0
Passive Service Checks Last 1/5/15 min: 0 / 0 / 0

External Commands Last 1/5/15 min:      0 / 0 / 0

-m 进入 MRTG 兼容的单行数值输出模式,配合 -d 指定变量,便于被采集脚本按行读取:

naemonstats -m -d NUMHOSTS,NUMSERVICES

实测回显:

1
8

可用变量清单以 naemonstats --help 的 "MRTG DATA VARIABLES" 段为准(含 NUMSVCOK、NUMHSTDOWN、时延类等);注意本版对不支持的变量并不报错,而是原样输出变量名,实测:

naemonstats -m -d NUMHOSTS,NUMSERVICES,TOTCMDBUF,USEDCMDBUF

实测回显:

1
8
TOTCMDBUF
USEDCMDBUF

后两行即无效变量的表现,采集脚本应按"数值才入库"处理。

4.4 unixcat:Livestatus 命令行查询

naemon-livestatus 模块在 /var/cache/naemon/live 提供 unix socket,unixcat 把标准输入作为请求发往 socket 并回显响应。请求体是 Livestatus 查询语法:GET <表> 起头,可跟 Columns:(选列)、Filter:(过滤)等头字段,空行结束。

查 status 表的版本与启动时间:

printf 'GET status\nColumns: program_version program_start naemon_pid\n\n' | unixcat /var/cache/naemon/live

实测回显:

1.5.2;1793507964;

第三列为空:naemon_pid 并不是 status 表的合法列名。Livestatus 对未知列名不报错、直接输出空值,这是排障时容易踩的坑——写查询前先用 ColumnHeaders: on 校验列名(见下例)。

程序消费场景推荐 JSON 输出:

printf 'GET status\nColumns: program_version\nOutputFormat: json\n\n' | unixcat /var/cache/naemon/live

实测回显:

[["1.5.2"]]

查 hosts 表的主机名、状态与插件输出:

printf 'GET hosts\nColumns: name state plugin_output\n\n' | unixcat /var/cache/naemon/live

实测回显:

localhost;0;PING OK - Packet loss = 0%, RTA = 0.04 ms

state 为 0 即 UP。默认输出是分号分隔的纯文本,加 ColumnHeaders: on 附列头:

printf 'GET services\nColumns: host_name description state\nFilter: state != 0\nColumnHeaders: on\n\n' | unixcat /var/cache/naemon/live

实测回显:

host_name;description;state
localhost;SSH;2

Filter: state != 0 过滤出非 OK 服务:样例配置中 SSH 服务因本机 22 端口无监听处于 state=2(CRITICAL),与 4.7 节插件调试的结论一致。

4.5 外部命令文件:naemon.cmd

外部命令是运维脚本介入运行中实例的通道:向 command_file 指定的文件写入一行 [unix时间戳] 命令名;参数,核心在下个调度循环读取执行。前置条件是主配置 check_external_commands=1(参数详解见本专栏配置参数详解篇 5.8 节)。command_file 实际是命名管道:

ls -l /var/lib/naemon/naemon.cmd

实测回显(core 消费后为 0 字节):

prw-rw---- 1 naemon naemon 0 Nov  1 04:23 /var/lib/naemon/naemon.cmd

实测一:全局开启通知

printf '[%s] ENABLE_NOTIFICATIONS\n' "$(date +%s)" > /var/lib/naemon/naemon.cmd
sleep 3
grep 'ENABLE_NOTIFICATIONS' /var/log/naemon/naemon.log | tail -1

实测回显:

[1793507515] EXTERNAL COMMAND: ENABLE_NOTIFICATIONS;

log_external_commands=1 时每条外部命令都会落一行 EXTERNAL COMMAND: 日志,是确认命令被消费的最直接依据。

实测二:强制立即重检服务

printf '[%s] SCHEDULE_FORCED_SVC_CHECK;localhost;PING;%s\n' "$(date +%s)" "$(date +%s)" > /var/lib/naemon/naemon.cmd
sleep 3
grep 'SCHEDULE_FORCED_SVC_CHECK' /var/log/naemon/naemon.log | tail -1

实测回显:

[1793508624] EXTERNAL COMMAND: SCHEDULE_FORCED_SVC_CHECK;localhost;PING;1793508624

时间戳 1793508624 即命令下达时刻,PING 服务会在下个调度循环被强制重检,不受常规调度间隔约束。命令名与对象名均大小写敏感,服务名(如 PING)要与对象定义完全一致。

4.6 日志检索与归档

运行日志位于 log_file 指定的 /var/log/naemon/naemon.log,每行以 [unix时间戳] 起头。直接 tail 看最新事件:

tail -4 /var/log/naemon/naemon.log

实测回显:

[1793507964] TIMEPERIOD TRANSITION: us-holidays;-1;0
[1793507964] TIMEPERIOD TRANSITION: workhours;-1;0
[1793507964] Naemon successfully initialized (PID=11039)
[1793508091] SERVICE NOTIFICATION SUPPRESSED: localhost;SSH;Notifications are disabled for this object by its configuration.

常见检索姿势(均实测可用):

grep 'EXTERNAL COMMAND' /var/log/naemon/naemon.log | tail -2
grep 'SERVICE ALERT' /var/log/naemon/naemon.log | tail -5
grep -c 'WARNING' /var/log/naemon/naemon.log

归档目录 log_archive_path=/var/log/naemon/archives,日志按主配置滚动策略归档转移:

ls /var/log/naemon/archives/

实测回显为空:新装环境尚未跨过滚动周期,归档为空属正常现象。

4.7 插件本地调试

所有 check_* 插件都是独立可执行程序,排查"服务为什么告警"时,先脱离调度器在命令行手动执行是最快路径:

out=$(/usr/lib/nagios/plugins/check_ping -H 127.0.0.1 -w 100.0,20% -c 500.0,60% -p 1 2>&1); rc=$?; echo "$out"; echo "rc=$rc"

实测回显:

PING OK - Packet loss = 0%, RTA = 0.03 ms|rta=0.025000ms;100.000000;500.000000;0.000000 pl=0%;20;60;0
rc=0
out=$(/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p / 2>&1); rc=$?; echo "$out"; echo "rc=$rc"

实测回显:

DISK OK - free space: / 120420 MB (42% inode=81%);| /=165491MB;241029;271158;0;301287
rc=0

故意打不存在的端口,验证告警态与退出码的对应:

out=$(/usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 22 2>&1); rc=$?; echo "$out"; echo "rc=$rc"

实测回显:

connect to address 127.0.0.1 and port 22: Connection refused
rc=2

退出码即检查状态,这是 monitoring-plugins 的通用约定:

退出码状态含义
0OK正常
1WARNING警告阈值触发
2CRITICAL严重阈值触发
3UNKNOWN参数错误/无法判定

输出竖线 | 之后是性能数据(perfdata),process_performance_data=1 时可被采集(参数详解见本专栏配置参数详解篇)。手动调试通过后,再把同参数写入对象定义的 check_command。

五、注意事项

  1. root 限制:核心程序拒绝以 root 运行,校验/预缓存一律用 su -s /bin/bash naemon -c "...";--allow-root 仅作应急且会打印 WARNING,勿作为常规姿势。
  2. -u 依赖 -p 且会过期:-u 读的是 objects.precache 快照,对象配置(/etc/naemon/conf.d 等)变更后必须重新 -p,否则校验与启动用的是旧对象。
  3. 外部命令时间戳必须带方括号:[1793508624] CMD... 格式,缺方括号核心无法解析;command_file 是命名管道,由核心消费,无需手工清理。
  4. naemonstats MRTG 模式的无效变量不报错:传了本版不支持的变量会原样输出变量名(实测见 4.3 节),采集脚本解析时要做数值校验。
  5. Livestatus 未知列名返回空值:查询返回全空列时先怀疑列名写错,用 ColumnHeaders: on 核对(实测见 4.4 节)。
  6. naemonstats 数值有刷新延迟:数据来自 status.dat,其更新节奏由 status_update_interval 决定,读到的统计可能滞后最多一个刷新周期。
  7. -d 与 systemd 二选一:systemd 托管环境用 systemctl/naemon-ctl 管理进程,手动 -d 会产生脱离托管的第二实例。

六、常见问题

Q1:naemon -v 直接报 "ERROR: do not start naemon as root user." 怎么办?

这是核心的主动保护:监控进程不应以 root 运行。预检改用 naemon 用户执行:su -s /bin/bash naemon -c "naemon -v /etc/naemon/naemon.cfg"。确需 root 运行可加 --allow-root(会打印 WARNING),但仅建议临时应急。

Q2:naemon -T -v -u 报找不到预缓存文件,或校验结果和刚改的配置对不上?

-u 使用的是 -p 生成的 objects.precache。首次使用先执行 su -s /bin/bash naemon -c "naemon -p /etc/naemon/naemon.cfg" 生成;之后每次改动对象配置都要重新 -p,否则看到的是旧缓存。

Q3:unixcat 查询没有任何输出或报连接失败?

依次确认:naemon 服务是否运行(socket 随核心进程创建,进程不在 socket 消失);naemon-livestatus 模块是否已加载(module-conf.d 中 broker_module 配置,见本专栏配置参数详解篇 5.8 节);socket 路径是否与模块参数一致(默认 /var/cache/naemon/live)。

Q4:外部命令写入 naemon.cmd 后没有任何效果、日志里也没有 EXTERNAL COMMAND 行?

按序检查:主配置 check_external_commands 是否为 1;写入行是否带方括号时间戳;log_external_commands 是否为 1(关了就没有日志行,但命令仍会执行);命令名与参数拼写、大小写是否正确(如 SCHEDULE_FORCED_SVC_CHECK、服务名 PING)。

七、参考链接

  • Naemon 官网(文档与 FAQ):https://www.naemon.io (查询日期 2026-11-01)
  • Naemon Core 源码仓库:https://github.com/naemon/naemon-core (查询日期 2026-11-01)
  • Monitoring Plugins 官网(插件用法与退出码约定):https://www.monitoring-plugins.org (查询日期 2026-11-01)
  • 本专栏介绍篇:《Naemon 介绍与选型指南》
  • 本专栏部署篇:《Ubuntu 22.04 安装 Naemon 1.5 指南》
  • 本专栏配置篇:《Naemon 1.5 配置参数详解》
Naemon 1.5 常用 CLI 命令与工具详解 - Quzuo