Kamailio 6.1 常用 CLI 命令与工具详解
Kamailio 6.1 常用 CLI 命令与工具详解:kamailio 主程序启动参数与语法检查、kamctl 管理命令族、kamcmd RPC 实时管控逐命令实测,usrloc 位置表增查删闭环与排障实录。
Kamailio 6.1 常用 CLI 命令与工具详解
目标:把 Kamailio 6.1.5 的四个命令行工具(kamailio 主程序、kamctl、kamcmd、kamdbctl)的常用命令一次讲全——每个命令配真实输入与实测回显,覆盖服务管理、运行状态观测、cfg 参数热改、usrloc 位置表增查删闭环与常见报错排障。已在 Ubuntu 22.04(kamailio 6.1.5,x86_64,监听 5070)实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Kamailio:6.1.5(官方 apt 仓库安装,安装与配置见《Ubuntu 22.04 安装 Kamailio 6.1 指南》)
- 监听:
udp/tcp 0.0.0.0:5070(alias10.0.0.8),服务以service kamailio start运行中 - 工具路径(实测
which):/usr/sbin/kamailio:SIP 主程序(守护进程本体)/usr/sbin/kamctl:管理脚本,版本号kamctl 6.1.0,经 jsonrpcs 模块 FIFO 通信/usr/sbin/kamcmd:RPC 客户端,经 ctl 模块 unix socket 通信/usr/sbin/kamdbctl:数据库初始化脚本(需先安装数据库模块子包,本文环境未启 DB,仅介绍用途)
二、工具概览
四个工具的分工与通信通道(选错通道是最常见的"命令没反应"根因):
| 工具 | 角色 | 通信通道 | 典型用途 |
|---|---|---|---|
| kamailio | 主程序 | —— | 启动进程、-c 语法检查、-V 版本 |
| kamctl | 高层管理脚本 | jsonrpcs FIFO(/run/kamailio/) | ul 位置表、stats、uptime、服务控制 |
| kamcmd | RPC 客户端 | ctl unix socket | cfg 参数热改、core/模块级命令 |
| kamdbctl | 数据库脚本 | 直连数据库 | 建 kamailio 库表、加 subscriber |
💡 技术拓展:Kamailio 的管控通道不止 CLI 一种,按运维场景选——
通道 形式 适用 kamctl / kamcmd 本地 CLI 日常巡检、单机排障 JSONRPC-over-HTTP xhttp + event_route[xhttp:request]远程管控面板、Prometheus exporter 类集成 binrpc(ctl 模块 TCP) tcp:<ip>:<port>跨机 RPC KEMI 脚本 API Lua/Python 嵌入 把管理逻辑写进路由脚本 本文覆盖前两类中最常用的 CLI 部分;JSONRPC-over-HTTP 需在 cfg 里
#!define WITH_JSONRPC并放行 xhttp 事件路由。
三、前置条件
- Kamailio 正在运行(两个 CLI 都是与运行中进程对话的客户端):验证
kamctl uptime有正常回显。 jsonrpcs.so与ctl.so已加载(官方默认 cfg 已内置):kamctl srv modules可核对。- FIFO/socket 目录
/run/kamailio/存在(systemdRuntimeDirectory=kamailio自动维护)。
四、kamailio 主程序命令详解
4.1 查看版本与编译特性(-V)
kamailio -V
实测输出:
version: kamailio 6.1.5 (x86_64/Linux)
flags: USE_TCP, USE_TLS, USE_SCTP, TLS_HOOKS, USE_RAW_SOCKS, DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MMAP, PKG_MALLOC, MEM_JOIN_FREE, Q_MALLOC, F_MALLOC, TLSF_MALLOC, DBG_SR_MEMORY, DBG_QM_MALLOC, DBG_F_MALLOC, DBG_TLSF_MALLOC, USE_FUTEX, USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR, USE_DST_BLOCKLIST, HAVE_RESOLV_RES, TLS_PTHREAD_MUTEX_SHARED
MAX_RECV_BUFFER_SIZE 262144, MAX_SEND_BUFFER_SIZE 262144, MAX_URI_SIZE 1024, BUF_SIZE 65535, DEFAULT PKG_SIZE 8MB
poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
id: unknown
compiled with gcc 11.4.0
flags 行是编译特性清单:USE_TCP/TLS/SCTP 说明协议支持,*_MALLOC 系列是内存分配器。-I 输出更详细的内部编译选项。
4.2 配置语法检查(-c)
改配置后先检查再重启的标准动作:
kamailio -c -f /etc/kamailio/kamailio.cfg
实测输出(结尾):
config file ok, exiting...
故意写坏配置(在 kamailio-local.cfg 追加一行非法 listen=broken)再检查:
failed to initialize list addresses
0(4883) INFO: <core> [core/sctp_core.c:53]: sctp_core_destroy(): SCTP API not initialized
-c 不占端口、不启进程,坏配置被拦在重启之前,是零中断验证配置的标准手段。
4.3 启动参数速查(-h)
kamailio -h
实测输出(节选,参数均标注真实默认行为):
Usage: kamailio [options]
Options:
-a mode Auto aliases mode: enable with yes or on, disable with no or off
--alias=val Add a domain alias, the value has to be '[proto:]hostname[:port]'
-A define Add config pre-processor define (e.g., -A WITH_AUTH, -A 'FLT_ACC=1')
-b nr Maximum OS UDP receive buffer size which will not be exceeded by
auto-probing-and-increase procedure even if OS allows
-c Check configuration file for syntax errors
--cfg-print Print configuration file evaluating includes and ifdefs
-d Debugging level control (multiple -d to increase the level from 0)
--debug=val Debugging level value
-D Control how daemonize is done:
-D..do not fork (almost) anyway;
-DD..do not daemonize creator;
-DDD..daemonize (default)
-e Log messages printed in terminal colors (requires -E)
-E Log to stderr
-f file Configuration file (default: /etc/kamailio/kamailio.cfg)
-g gid Change gid (group id)
-h This help message
-K Turn on "via:" host checking when forwarding replies
-l address Listen on the specified address/interface (multiple -l mean
listening on more addresses)
高频组合:kamailio -D -E -f /etc/kamailio/kamailio.cfg 前台运行直打 stderr,排障启动首选;--cfg-print 打开展开 include/ifdef 后的完整配置,看实际生效配置比读源文件准。
五、kamctl 管理命令详解
kamctl 的命令清单用 kamctl which(不带参数等价)查看,实测命令族如下:
kamctl which
实测输出(节选):
/usr/sbin/kamctl 6.1.0
Existing commands:
-- command 'start|stop|restart|trap'
trap ............................... trap with gdb Kamailio processes using RPC
restart ............................ restart Kamailio
start .............................. start Kamailio
stop ............................... stop Kamailio
-- command 'srv' - server management commands
srv sockets ................... show the list of listen sockets
srv aliases ................... show the list of server aliases
srv rpclist ................... show the list of server rpc commands
srv modules ................... show the list of loaded modules
srv version ................... show the server version
-- command 'ul|alias' - manage user location or aliases
ul show [<username>]................... show in-RAM online users
ul show --brief........................ show in-RAM online users in short format
ul rm <username> [<contact URI>]....... delete user's usrloc entries
ul add <username> <uri> ............... introduce a permanent usrloc entry
ul add <username> <uri> <expires> ..... introduce a temporary usrloc entry
-- command 'ps' - print details about running processes
-- command 'uptime' - print uptime details
-- command 'stats' - print internal statistics
-- command 'rpc' - send raw RPC commands
5.1 服务控制:start / stop / restart
kamctl restart
实测输出:
Killing Kamailio: (pid(s) 4153) ...
* Restarting Kamailio SIP Server: kamailio
...done.
等价于 service kamailio restart(kamctl start/stop/restart 直接操作 init 脚本)。生产运行中慎用 stop——SIP 注册与对话会中断。
5.2 运行状态观测:uptime / ps / version
kamctl uptime
实测输出:
{
"jsonrpc": "2.0",
"result": {
"now": "Wed Oct 21 17:17:23 2026",
"up_since": "Wed Oct 21 11:51:17 2026",
"uptime": 19566
},
"id": 4690
}
kamctl ps
实测输出(节选,与 ps aux | grep kamailio 的进程一一对应):
{
"jsonrpc": "2.0",
"result": [
{
"IDX": 0,
"PID": 4153,
"DSC": "main process - attendant"
},
...
]
}
kamctl version
实测回显:
/usr/sbin/kamctl 6.1.0
5.3 监听与模块核对:srv 子命令
kamctl srv sockets
实测输出(节选,核对 7.2 配置的 5070 监听是否生效):
{
"jsonrpc": "2.0",
"result": [
{
"af": "IPv4",
"proto": "udp",
"name": "0.0.0.0",
"port": "5070"
}
]
}
kamctl srv modules
实测输出(节选):
{
"jsonrpc": "2.0",
"result": [
"dlgs",
"counters",
"acc",
"cfg_rpc",
"ctl",
"sanity"
]
}
5.4 位置表管理:ul 增查删闭环
usrloc(user location)表是注册服务器的核心数据。逐条实测完整闭环:
增——手工加一条永久 AOR:
kamctl ul add 1002@10.0.0.8 sip:1002@10.0.0.8:5060
实测输出(结尾,jsonrpc 成功回执):
"id": 5117
}
查——看指定 AOR:
kamctl ul show 1002@10.0.0.8
实测输出(节选):
"AoR": "1002",
"Address": "sip:1002@10.0.0.8:5060",
"Expires": "permanent",
Expires: permanent 即手工条目不会自动过期。带第三个参数可加临时条目:kamctl ul add 1002@10.0.0.8 sip:1002@10.0.0.8:5060 600(600 秒后过期)。全表概览用短格式:
kamctl ul show --brief
实测输出(节选):
{
"jsonrpc": "2.0",
"result": {
"Domains": [
{
"Domain": {
"Domain": "location",
"Size": 1024
}
}
]
}
}
删——移除条目并验证:
kamctl ul rm 1002@10.0.0.8
实测输出(节选):
"result": {
},
再查已删 AOR,实测返回明确错误态:
{
"jsonrpc": "2.0",
"error": {
"code": 500,
"message": "AOR not found in location table"
}
}
⚠️ 排障实录:
ul add/ul show的用户名参数必须带域。实测漏写域直接报错:** ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN两种解决:① 命令里写全
1002@10.0.0.8形式(如上);② 编辑/etc/kamailio/kamctlrc加一行SIP_DOMAIN=10.0.0.8,此后kamctl ul add 1002 ...自动补域。
5.5 统计与原始 RPC:stats / rpc
kamctl stats
实测输出(节选,全量统计等价于 kamcmd 按组拉取):
{
"jsonrpc": "2.0",
"result": [
"core:bad_URIs_rcvd = 0",
"core:bad_msg_hdr = 0",
"core:drop_replies = 0",
"core:rcv_replies = 0"
]
}
kamctl 也能发任意 RPC 原始命令,等价于 kamcmd 的通道差异版:
kamctl rpc core.version
实测输出:
{
"jsonrpc": "2.0",
"result": "kamailio 6.1.5 (x86_64/Linux) ",
"id": 4818
}
六、kamcmd RPC 客户端详解
kamcmd 走 ctl 模块 unix socket(/run/kamailio/kamailio_ctl),输出比 kamctl 更紧凑(非 JSON)。命令组清单:
kamcmd help
实测输出(节选):
cfg.add_group_inst
cfg.commit
cfg.del
cfg.del_group_inst
cfg.diff
cfg.get
cfg.help
...
6.1 核心信息:core.version / uptime / psx / shmmem
kamcmd core.version
实测回显:
kamailio 6.1.5 (x86_64/Linux)
kamcmd core.uptime
实测输出:
{
now: Wed Oct 21 17:14:52 2026
up_since: Wed Oct 21 11:51:17 2026
uptime: 19415
}
kamcmd core.psx
实测输出(节选;children=8 对应 8 个 udp receiver child):
{
IDX: 0
PID: 4153
DSC: main process - attendant
}
{
IDX: 1
PID: 4154
DSC: udp receiver child=0 sock=0.0.0.0:5070
}
kamcmd core.shmmem
实测输出(共享内存水位,64MB 分配对应 /etc/default/kamailio 的 SHM_MEMORY=64):
{
total: 67108864
free: 64223392
used: 2607008
real_used: 2885472
max_used: 2885472
fragments: 1
}
6.2 cfg 参数热改:cfg.get / cfg.seti
kamcmd cfg.get core debug
实测回显:
2
kamcmd cfg.seti core debug 3
kamcmd cfg.get core debug
kamcmd cfg.seti core debug 2
实测回显:
3
(完整的热改闭环与"重启回退"注意事项见《Kamailio 6.1 配置参数详解》3.2 节。)
6.3 统计拉取:stats.get_statistics
支持按组、多组连查(组名后缀冒号):
kamcmd stats.get_statistics core: sl: usrloc:
实测输出(节选;sl:200_replies/sl:403_replies 与实测 REGISTER 行为精确对应):
core:rcv_requests = 5
sl:200_replies = 4
sl:403_replies = 1
usrloc:location-contacts = 1
usrloc:location-users = 1
6.4 套接字核对:core.sockets_list
kamcmd core.sockets_list
实测输出(节选):
{
socket: {
af: IPv4
proto: udp
address: 0.0.0.0
port: 5070
mcast: no
mhomed: no
virtual: no
}
}
七、kamdbctl 简介
kamdbctl 是数据库初始化脚本,负责创建 kamailio 库的全部表结构(subscriber、location、acc、dispatcher 等)。使用前置条件:安装对应数据库模块子包(如 apt-get install kamailio-mysql-modules)并在 /etc/kamailio/kamctlrc 配置 DBENGINE=MYSQL、数据库连接参数。常用命令:
kamdbctl create # 创建 kamailio 库与全部标准表
kamdbctl reinit # 重建(清空现有数据)
kamdbctl presence # 补建 presence 相关表
本文实测环境为纯内存 usrloc(未启用数据库),上述命令为 kamdbctl 6.1.0 的标准用法;启用 WITH_MYSQL + WITH_AUTH 后由 kamctl add <user> <password> 添加 SIP 用户。
八、注意事项
- 选对通道:kamctl 报
ERROR: doesn't support FIFO类错误通常是 jsonrpcs 的 FIFO 未创建——核对kamctlrc中RPC_FIFO路径与进程RuntimeDirectory权限;kamcmd 连接拒绝则核对 ctl 模块 unix socket/run/kamailio/kamailio_ctl是否存在。 - stop 是真停:
kamctl stop/service kamailio stop会中断全部注册与对话,高可用场景优先滚动重启。 - 热改不落盘:
kamcmd cfg.seti只改运行值,重启即回退(见《Kamailio 6.1 配置参数详解》Q1)。 - 语法检查前置于重启:任何 cfg 改动先
kamailio -c -f <文件>,实测坏配置会被-c拦下(4.2 节双态输出)。 - ul 操作用户名带域:否则报
domain unknown(5.4 排障实录),或 kamctlrc 落 SIP_DOMAIN。
九、常见问题(FAQ)
Q1:kamctl 命令卡住无输出?
kamctl 经 FIFO 与进程通信,若 Kamailio 实际没在运行,FIFO 不存在会等待超时。先 service kamailio status 确认进程态,再重试;FIFO 路径以 kamctlrc 的 RPC_FIFO(默认 /run/kamailio/kamailio_rpc.fifo)为准。
Q2:ul show 全表输出太长,怎么只看摘要?
kamctl ul show --brief 只列域与计数;单个用户用 kamctl ul show <user>@<domain> 精确查询;内存表规模看 kamcmd stats.get_statistics usrloc: 的 location-users/location-contacts 计数。
Q3:kamcmd 与 kamctl 同一命令结果格式不同?
正常。kamctl 是脚本封装、输出 JSONRPC 原文;kamcmd 是二进制协议客户端、输出紧凑键值对。两者最终调的是同一套 RPC 命令,数值一致(实测 core.version 两通道同回 kamailio 6.1.5 (x86_64/Linux))。
Q4:如何确认某个模块真的加载了?
kamctl srv modules 列出全部已加载模块名(5.3 节实测);模块级命令是否存在可用 kamcmd help | grep <模块名> 过滤。
十、参考链接
- Kamailio 官方文档索引:https://www.kamailio.org/wikidocs/
- kamctl 手册页(随包):
man kamctl/man kamcmd/man kamdbctl - RPC 命令全表(core 与各模块):https://kamailio.org/docs/modules/6.1.x/ 各模块的 RPC Commands 段
- 本文姊妹篇:《Ubuntu 22.04 安装 Kamailio 6.1 指南》《Kamailio 6.1 配置参数详解》