Apache Roller 常用 CLI 命令与工具详解

详解 Apache Roller 6.1.3 日常运维的命令行工具,涵盖 systemctl 托管 tomcat9/mariadb、mariadb 客户端查用户与博客、curl 走注册登录与初始化向导、RSS/RSD 内容接口校验、roller.log 排障与端口核验,命令与回显均实测

Apache RollerApache Roller2026/10/12

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

二、工具概览

工具来源用途
systemctlsystemd管理 tomcat9 / mariadb 服务启停与状态
journalctlsystemd查看服务单元日志(Tomcat stdout/stderr)
mariadbmariadb-server 自带查询/维护 rollerdb(用户、博客、参数表)
curlcurl 包调用 Roller Web 表单与 RSS/Atom 接口,初始化向导自动化
tail / grepcoreutils跟踪 roller.log / catalina 日志排障
netstatnet-tools 包核验 8080/3306 监听
psprocps 包核验 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.logRoller 业务日志(启动引导、数据库初始化、任务调度、报错主战场)
catalina.<日期>.logTomcat 服务器级日志:部署、启停
localhost.<日期>.logWeb 应用抛出的异常栈(listener/filter 报错在这里)
localhost_access_log.<日期>.txtHTTP 访问流水

跟踪启动直到成功标识:

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 定位启动失败原因。

七、参考链接