Apache Roller 常用 CLI 命令与工具详解
详解 Apache Roller 6.1.3 日常运维的命令行工具,涵盖 systemctl 托管 tomcat9/mariadb、mariadb 客户端查用户与博客、curl 走注册登录与初始化向导、RSS/RSD 内容接口校验、roller.log 排障与端口核验,命令与回显均实测
Apache Roller 常用 CLI 命令与工具详解
目标:详解 Apache Roller 6.1.3 日常运维命令行工具——systemctl 服务托管、mariadb 数据库客户端、curl 完成注册/登录/初始化向导与 RSS 校验、日志排障与端口进程核验。Roller 本体不带 CLI 脚本,运维能力全部由操作系统工具 + HTTP 接口组合完成。所有命令与回显均为 Ubuntu 22.04 真实环境实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Apache Roller:6.1.3(
/var/lib/tomcat9/webapps/roller.war,访问前缀/roller) - Apache Tomcat:9.0.58(systemd 单元
tomcat9,配置/etc/default/tomcat9) - 数据库:MariaDB 10.6.23(systemd 单元
mariadb,库名 rollerdb) - Java:OpenJDK 11.0.32.1
- 访问地址:http://localhost:8080/roller/
- 站长账号:admin / q1w2e3r4
二、工具概览
| 工具 | 来源 | 用途 |
|---|---|---|
systemctl | systemd | 管理 tomcat9 / mariadb 服务启停与状态 |
journalctl | systemd | 查看服务单元日志(Tomcat stdout/stderr) |
mariadb | mariadb-server 自带 | 查询/维护 rollerdb(用户、博客、参数表) |
curl | curl 包 | 调用 Roller Web 表单与 RSS/Atom 接口,初始化向导自动化 |
tail / grep | coreutils | 跟踪 roller.log / catalina 日志排障 |
netstat | net-tools 包 | 核验 8080/3306 监听 |
ps | procps 包 | 核验 Java 进程与 JVM 参数生效值 |
三、前置条件
- 已按《Apache Roller 安装指南》完成部署,首页可访问。
- 服务由 systemd 托管:
systemctl start tomcat9、systemctl start mariadb均为 active。 - 本机已安装
net-tools、curl(apt-get install -y net-tools curl)。 - 数据库查询需能以 root 或roller 账号连入本机 MariaDB(root 默认走 unix_socket 免密)。
四、工具详解
4.1 systemctl 服务管理
Roller 依赖两个单元,逐个操作:
systemctl status tomcat9 --no-pager
回显(节选):
● tomcat9.service - Apache Tomcat 9 Web Application Server
Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-12 00:53:21 UTC; 1min 58s ago
systemctl status mariadb --no-pager
回显(节选):
● mariadb.service - MariaDB 10.6.23 database server
Active: active (running) since Mon 2026-10-12 00:45:03 UTC; 10min ago
Main PID: 5420 (mariadbd)
常用操作(每条命令只针对一个单元):
systemctl restart tomcat9 # Roller 配置/依赖变更后重启(生效开关)
systemctl restart mariadb # 数据库维护后重启
systemctl stop tomcat9 # 停应用(升级 WAR 前先停)
systemctl start tomcat9 # 启动应用
systemctl is-active tomcat9 # 状态速查,输出 active/inactive
systemctl is-enabled tomcat9 # 开机自启确认,输出 enabled
⚠️ 修改过 systemd drop-in(如
ReadWritePaths放行数据目录)后必须先systemctl daemon-reload再 restart,否则放行不生效。
单元级日志用 journalctl:
journalctl -u tomcat9 -n 20 --no-pager
4.2 mariadb 数据库客户端
Roller 的账号、博客、站点参数都落库,排障时直查最直接。库名 rollerdb:
mariadb rollerdb -e "SELECT username,fullname,emailaddress FROM roller_user;"
回显:
username fullname emailaddress
admin Site Admin admin@example.com
mariadb rollerdb -e "SELECT rolename,username FROM userrole;"
回显(第一个注册用户持有 admin 角色,即全局管理员):
rolename username
editor admin
admin admin
mariadb rollerdb -e "SELECT handle,name,creator FROM weblog;"
回显:
handle name creator
adminblog Admin Blog admin
站点参数表(对应管理后台 Server Admin → Configuration):
mariadb rollerdb -e "SELECT name,value FROM roller_properties WHERE name IN ('site.name','users.registration.enabled','uploads.file.maxsize');"
回显:
name value
site.name Roller Site
users.registration.enabled false
uploads.file.maxsize 2.00
表清单与数量(健康检查:全新导入应为 33 张业务表):
mariadb rollerdb -e "SHOW TABLES;" | wc -l
回显:
34
⚠️ roller_properties 建议只读排查、改动走管理后台,直接 UPDATE 会绕过缓存刷新与校验。
4.3 curl 初始化与管理操作
Roller 的管理操作是标准 Struts 表单,curl 通用套路:GET 表单页取 salt(会话级 CSRF 令牌,需同一 cookie jar)→ POST 提交。
注册用户(表单 action 为 /roller/roller-ui/register!save.rol):
curl -s -c /tmp/roller-cj.txt http://localhost:8080/roller/roller-ui/register.rol -o /tmp/reg.html
grep -E "<form" /tmp/reg.html
回显:
<form id="register" name="register" action="/roller/roller-ui/register!save.rol" method="post" class="form-horizontal">
SALT=$(grep -oE "name=\"salt\" value=\"[^\"]+\"" /tmp/reg.html | sed "s/.*value=\"\([^\"]*\)\".*/\1/")
curl -s -b /tmp/roller-cj.txt -c /tmp/roller-cj.txt -X POST "http://localhost:8080/roller/roller-ui/register!save.rol" \
--data-urlencode "salt=$SALT" --data-urlencode "bean.id=" \
--data-urlencode "bean.userName=admin" --data-urlencode "bean.screenName=admin" \
--data-urlencode "bean.fullName=Site Admin" --data-urlencode "bean.emailAddress=admin@example.com" \
--data-urlencode "bean.passwordText=q1w2e3r4" --data-urlencode "bean.passwordConfirm=q1w2e3r4" \
--data-urlencode "bean.locale=en_US" --data-urlencode "bean.timeZone=America/New_York" \
--data-urlencode "userRegister.button.save=Sign Up" -w "%{http_code}\n"
回显:
200
登录(Spring Security 表单,action 是 /roller/roller_j_security_check,注意不是标准 j_security_check):
curl -s http://localhost:8080/roller/roller-ui/login.rol | grep -oE "action=\"[^\"]*\""
回显:
action="/roller/roller_j_security_check"
curl -s -c /tmp/roller-cj.txt -b /tmp/roller-cj.txt -X POST "http://localhost:8080/roller/roller_j_security_check" \
-d "j_username=admin&j_password=q1w2e3r4" -o /dev/null -w "%{http_code} %{redirect_url}\n"
curl -s -b /tmp/roller-cj.txt -L http://localhost:8080/roller/roller-ui/menu.rol | grep -oE "<title>[^<]+</title>"
回显:
302 http://localhost:8080/roller/roller-ui/menu.rol
<title>Front Page: Your Weblogs</title>
创建博客(登录会话内,action /roller/roller-ui/createWeblog!save.rol;salt 同样从 GET 表单页取):
curl -s -b /tmp/roller-cj.txt http://localhost:8080/roller/roller-ui/createWeblog.rol -o /tmp/cw.html
SALT=$(grep -oE "name=\"salt\" value=\"[^\"]+\"" /tmp/cw.html | sed "s/.*value=\"\([^\"]*\)\".*/\1/")
curl -s -b /tmp/roller-cj.txt -X POST "http://localhost:8080/roller/roller-ui/createWeblog!save.rol" \
--data-urlencode "salt=$SALT" --data-urlencode "bean.name=Admin Blog" \
--data-urlencode "bean.handle=adminblog" --data-urlencode "bean.emailAddress=admin@example.com" \
--data-urlencode "bean.locale=en_US" --data-urlencode "bean.timeZone=America/New_York" \
--data-urlencode "bean.theme=basic" --data-urlencode "button.save=Create Weblog" -w "%{http_code}\n"
回显:
200
指定前台博客(向导页 /roller/roller-ui/setup.rol,action setup!save.rol):
curl -s -b /tmp/roller-cj.txt http://localhost:8080/roller/roller-ui/setup.rol -o /tmp/setup2.html
grep -A2 'name="frontpageBlog"' /tmp/setup2.html
回显:
<select name="frontpageBlog" id="setup_frontpageBlog" class="form-control">
<option value="adminblog">Admin Blog</option>
SALT=$(grep -oE "name=\"salt\" value=\"[^\"]+\"" /tmp/setup2.html | sed "s/.*value=\"\([^\"]*\)\".*/\1/")
curl -s -b /tmp/roller-cj.txt -X POST "http://localhost:8080/roller/roller-ui/setup!save.rol" \
--data-urlencode "salt=$SALT" --data-urlencode "frontpageBlog=adminblog" \
--data-urlencode "aggregated=true" --data-urlencode "__checkbox_aggregated=true" -w "%{http_code}\n"
回显:
302
首页核验:
curl -s http://localhost:8080/roller/ | grep -oE "<title>[^<]+</title>"
回显:
<title>Admin Blog</title>
4.4 curl 内容访问接口(RSS/RSD)
博客内容对外是只读 URL,curl 可直接校验:
curl -s http://localhost:8080/roller/adminblog/feed/entries/rss | head -1
curl -s -o /dev/null -w "rsd=%{http_code}\n" http://localhost:8080/roller/adminblog/rsd
curl -s -o /dev/null -w "weblog_page=%{http_code}\n" http://localhost:8080/roller/adminblog/
回显:
<?xml version="1.0" encoding="utf-8"?>
rsd=200
weblog_page=200
💡 RSS 地址规律:
/roller/<博客handle>/feed/entries/rss;RSD(供老博客客户端发现 AtomPub/XML-RPC 接口)在/roller/<博客handle>/rsd。
4.5 日志查看(tail / grep)
Roller 自身日志与 Tomcat 日志都在 /var/log/tomcat9/:
| 文件 | 内容 |
|---|---|
roller.log | Roller 业务日志(启动引导、数据库初始化、任务调度、报错主战场) |
catalina.<日期>.log | Tomcat 服务器级日志:部署、启停 |
localhost.<日期>.log | Web 应用抛出的异常栈(listener/filter 报错在这里) |
localhost_access_log.<日期>.txt | HTTP 访问流水 |
跟踪启动直到成功标识:
tail -f /var/log/tomcat9/roller.log
启动成功关键行:
INFO 2026-10-12 00:53:31 [main] WebloggerFactory - Version: 6.1.3
INFO 2026-10-12 00:53:31 [main] WebloggerFactory - Revision: r2faff60f88a631d4a313e4b7511269943ba31b20
INFO 2026-10-12 00:53:32 [main] ThemeManagerImpl - Successfully loaded 5 themes from disk.
INFO 2026-10-12 00:53:32 [main] WebloggerImpl - Roller Weblogger business tier successfully initialized
快速定位错误:
grep -E "ERROR|SEVERE" /var/log/tomcat9/roller.log | tail -5
grep -A5 "SEVERE" /var/log/tomcat9/localhost.2026-10-12.log | head -12
tail -20 /var/log/tomcat9/localhost_access_log.2026-10-12.txt
4.6 netstat / ps 端口与进程核验
netstat -tlnp | grep -E "8080|3306"
回显:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5420/mariadbd
tcp6 0 0 :::8080 :::* LISTEN 6294/java
JVM 参数生效值核验(堆 256-512MB 配置后):
ps -ef | grep "[j]ava" | grep -oE "\-Xms[0-9]+m \-Xmx[0-9]+m"
回显:
-Xms256m -Xmx512m
版本确认:
/usr/share/tomcat9/bin/version.sh | grep -E "Server version|JVM Version"
回显:
Server version: Apache Tomcat/9.0.58 (Ubuntu)
JVM Version: 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu
五、注意事项
- 所有 POST 类表单操作都带会话级
salt令牌:必须用同一 cookie jar 先 GET 表单页再 POST,salt 取自页面的name="salt"隐藏域,过期或换会话会提交失败。 - 登录地址是
/roller/roller_j_security_check(带 roller 前缀),照搬通用 Servlet 服务器默认地址会 404。 mariadb命令是 MariaDB 官方客户端;Ubuntu 上与 mysql 系包互斥,装了 mariadb-server 就用它。- 日志排障顺序建议:先
roller.log(业务错误)、再localhost.*.log(异常栈)、最后catalina.*.log(部署问题)。 - 重启 tomcat9 后 Roller 重新引导约需 10-90 秒,期间页面可能短暂 404/连接拒绝,属正常,以 roller.log 出现 successfully initialized 为准。
六、常见问题
6.1:curl POST 返回 200 但数据没建成功
原因:salt 与 cookie 会话不匹配或缺少必填字段(如 bean.passwordConfirm)。
解决:重新 GET 表单页刷新会话与 salt,保持 -c/-b 使用同一 cookie jar;对照表单页每个 name="bean.*" 字段补全。
6.2:登录总是 302 回登录页
排查:确认 POST 到 /roller/roller_j_security_check 且 j_username/j_password 正确;用 mariadb rollerdb -e "SELECT username,isenabled FROM roller_user;" 确认账号 isenabled=1;账号锁定或未激活时登录会被拒。
6.3:mariadb 命令报 Access denied
解决:本机 root 默认走 unix_socket 认证,需以 root 系统用户执行;业务查询用 mariadb -u roller -pq1w2e3r4 rollerdb ...。
6.4:grep 日志发现 Read-only file system
原因:Roller 数据目录不在 systemd ReadWritePaths 放行内。
解决:见《Apache Roller 配置参数详解》数据目录一节——drop-in 放行 + daemon-reload + 重启。
6.5:访问 8080 连接拒绝
排查:systemctl is-active tomcat9 确认 active;netstat -tlnp | grep 8080 确认监听;仍无监听看 journalctl -u tomcat9 -n 50 --no-pager 定位启动失败原因。
七、参考链接
- Apache Roller 官网:https://roller.apache.org/
- Apache Roller 安装指南 PDF(发行包 docs/ 目录):roller-install-guide.pdf
- MariaDB 客户端文档:https://mariadb.org/documentation/
- systemd 单元管理:https://www.freedesktop.org/software/systemd/man/systemctl.html