拓冰建站拓冰建站
首页 / 资讯中心 / 正文

TongWeb8 bin目录脚本详解:启动停止、JVM参数与systemd集成

1. 先搞清楚TongWeb8 的 bin 目录到底是干嘛的接手一个用了国产中间件的项目第一件事我向来是先翻安装目录把 bin 和 logs 下的可执行文件、启动脚本逐个看清。TongWeb8 是东方通出的 Java 应用服务器定位和 Tomcat、WebLogic 是一类东西目录结构、部署方式大体上也走 J2EE 那套路子。平时你可以在管理控制台里部署应用、配数据源、看监控但控制台起不来的时候或者说还没把界面配置通的时候真正能救你的就是 bin 目录下这一堆脚本。它们承担了中间件从“安装后”到“正常对外服务”的全部生命周期管理启动、停止、查版本、注册服务、配置变更全在这一层操作里。这篇文章不打算复制官方文档就按我实际使用的经验把这些脚本从头到尾理一遍顺带把 JVM 参数、日志位置、常见坑也交代清楚。适合刚接触 TongWeb8 的开发、测试和运维同学也适合准备把 TongWeb 从测试环境搬到生产环境的人参考。下面讲的脚本清单基于我接触过的 TongWeb8 发行版本不同小版本之间命名可能有差异比如有的发行包把服务注册脚本合并成 service.sh有的拆成 installService.sh / removeService.sh。你拿到安装包后可以先跑一条 ls 对照功能定位是一致的。1.1 按功能给脚本分个类先别急着一个个背名字理解 bin 目录的第一步是把它当成“指挥中心”。里面的脚本按功能其实就四类启动类startserver.sh / startserver.bat、firstStart.sh、startserver_noConsole.sh负责把 JVM 拉起来并选择合适的运行方式。停止类stopserver.sh / stopserver.bat负责对运行中的实例下发停机命令做优雅关闭。服务与配置类installService.sh / removeService.sh、dconfig.sh负责把中间件注册成系统服务或者调出图形化 / 命令行配置工具。辅助诊断类version.sh、jmxTool.sh 等负责版本核对、JMX 检查、补丁验证。这个分类方式能帮你快速定位问题应用起不来就看启动类脚本和 logs想确认补丁是否生效就去执行 version.sh要开机自启就盯服务注册脚本。别把脚本当孤立的文件看它背后对标的其实是“进程、端口、日志、服务”这四件事。1.2 脚本管理和控制台管理怎么分工很多人会问TongWeb 不是带图形控制台吗为什么还要用脚本工程师之间对这个问题的理解其实很有共识控制台解决的是“运行期管理”比如部署应用、配置数据源、看连接池状态、实时调日志级别而 bin 脚本解决的是“上线前和故障期”的场面。控制台上不去、启动失败、要做服务化改造最后都回到脚本。实际运维中脚本方式还被自动化工具大量使用。因为脚本输出稳定、退出码可靠可以被 CI/CD 流程直接调用图形界面没法在每个平台都保证一致的自动化接口。所以我的建议是控制台可以慢慢摸索脚本至少要做到关键几步心里有数不然真出故障时现查文档时间根本不够用。2. 启动、停止、服务注册核心脚本逐个拆2.1 startserver 与 startserver_noConsole前台后台怎么选startserver.sh 启动后会占据当前终端把 JVM 运行日志直接打在控制台上。开发环境用起来很直观起个服务窗口里滚日志出问题当场能看到异常堆栈。但在生产环境这个方式有个大坑终端一断开服务进程就可能收到挂断信号直接退出。所以纯 startserver.sh 不适合长期驻留。startserver_noConsole.sh 是去掉控制台绑定的启动方式进程启动后转入后台日志统一写到 logs 目录。生产机器上跑 TongWeb8我推荐用这个脚本配合 systemd后面第 6 节专门讲 systemd 的配置。另外第一次在一个新环境启动时我建议先用前台方式跑一把确认 JVM 参数、配置文件没写错再切到后台方式不然一启动就退日志里全是退出记录反而难定位问题。2.2 stopserver 的停止信号链路stopserver.sh 看起来就一行命令背后做的事却不简单。它并不是粗暴地杀掉进程而是通过管理端口去连接运行中的中间件实例发送一个停机指令。实例收到指令后会先停止接收新的连接接着把还在处理中的请求尽量处理完再释放数据源、保存会话状态、注销各类监听器最后才退出 JVM。对业务来说这个“最后才退出”很重要特别是页面里带长事务、文件上传这种耗时操作的场景。直接 kill -9 看起来进程没了但可能造成会话丢失、临时文件残留严重的还会让数据库连接池留下半开的事务。所以平时要养成先跑 stopserver 的习惯确实停不下来再考虑用系统命令处理。2.3 服务注册脚本让中间件开机自启把 TongWeb8 装到服务器上单机手动启动没问题可如果是十几台机器断电重启以后挨个去敲脚本就太原始了。TongWeb8 的 bin 目录里通常都有服务注册/移除脚本Windows 下对应 installService.batLinux 下可能是 installService.sh也有的发行包用 service.sh 统一管理。服务注册的本质是把启动命令包装成系统服务交给系统守护进程接管。注册完成后服务会随系统开机自动启动进程意外退出后也能被自动拉起对无人值守场景非常关键。配置服务时有一点必须注意服务启动时的用户身份。Windows 服务如果用了权限过高的账号数据库连接、文件写入偶尔会出权限问题Linux 下推荐专门建一个业务用户不要直接拿 root 跑中间件。3. 实操前置检查、JVM 参数与第一次启动3.1 启动前检查清单我每次部署 TongWeb8都会在跑 startserver 之前花三十秒过一遍环境比把错误留给日志去报强得多java -version echo $JAVA_HOME free -g df -h /data/tongweb netstat -tlnp | grep -E 80|8080|9060前两条确认 JDK 和 JAVA_HOMETongWeb8 对 JDK 版本有最低要求装错版本启动脚本会直接报版本不支持。第三条看内存第四条看磁盘主要盯 logs 和部署目录所在分区。最后一条查端口启动前确认端口没被其他服务占用。TongWeb8 的默认业务端口在不同发行包里可能不一样网上的“默认 8080”说法不一定适用最可靠的方式是看安装后生成的配置文件。3.2 JVM 参数放哪里、改什么TongWeb8 的 JVM 参数一般有两个入口一是 bin 下启动脚本里预留的变量区二是管理控制台的 server 配置。脚本方式适合安装阶段批量下发控制台方式适合在线修改但要真正生效通常得重启实例。给一个我常用的参数模板export JAVA_OPTS-Xms4096m -Xmx4096m -XX:MaxMetaspaceSize512m -XX:UseG1GC -XX:MaxGCPauseMillis200 -Dfile.encodingUTF-8 -Duser.timezoneGMT08-Xms 和 -Xmx 设成相同值可以避免 JVM 运行中途反复扩充堆内存带来的性能抖动。Metaspace 根据应用加载的类数量适当调整线上起步给 512m类特别多的系统可以考虑再加大。GC 日志也要顺手开起来方便以后排查内存问题-Xloggc:/data/tongweb/logs/gc_$(date %Y%m%d).log -XX:PrintGCDetails -XX:PrintGCDateStamps需要提醒的是具体参数名在不同 JDK 版本下略有区别比如 JDK 8 用 PrintGCDateStampsJDK 11 之后日志参数已经换了一套风格。改完参数后用启动脚本拉起再用 jps 或 ps 确认进程参数真实生效这一步最可靠。3.3 第一次启动的正确姿势第一次启动建议用前台方式cd /data/tongweb/bin ./startserver.sh看到日志里出现类似 start successfully 的关键字后可以先停在当前阶段观察确认没有问题再换后台方式正式跑。后台方式我一般这样执行./startserver_noConsole.sh sleep 15 tail -n 200 logs/server.log为什么要等十几秒再查日志因为中间件启动涉及初始化 Spring 容器、数据源、监听器一个大型应用启动可能要几十秒只有日志文件里出现明确的 ready 状态才说明它真正起来了。如果立刻看 log很容易误判“怎么没动静”。应用部署完浏览器访问http://服务器IP:端口/应用上下文验证。管理控制台的入口和账号初始化规则首次登录时系统会给出提示一定要第一时间修改初始密码互联网上扫描默认密码的脚本远比想象中多。3.4 版本核对和补丁验证升级或打补丁后第一时间要确认版本是否真的生效别出现文件覆盖了、版本号没变这种尴尬事cd /data/tongweb/bin ./version.sh这个脚本会输出产品版本号、build 时间、JDK 信息。打补丁最怕的就是“以为打了补丁”重启之后功能没变化一通排查才发现补丁压根没被加载。我现在养成的习惯是启动前先跑一次 version.sh启动后再跑一次前后输出各留一份排查问题时多一条明确线索。4. 脚本机制拆解优雅关闭、日志与 nohup 的区别4.1 启动脚本的执行链路启动脚本内部不是简单执行一个 java 命令它要做的事包括定位 JAVA_HOME、把 lib 目录下需要的 jar 全部拼进 classpath、加载系统属性和安全策略文件、检查配置目录是否存在、根据参数选择前台还是后台模式、必要时做端口检测和权限校验。执行链路里最容易出错的是 classpath。中间件的类加载比较讲究脚本里 classpath 的顺序如果乱了后续应用部署时就会出现“类找不到”或者“类重复”的诡异问题。所以别轻易修改启动脚本里和 classpath 相关的内容真要加外部 jar优先通过管理控制台或脚本指定扩展目录不要直接替换 bin 脚本的主体。4.2 为什么 stopserver 比 kill -9 更安全前面提过 stopserver 走的是管理端口信号我再展开说一下。运行中的 JVM 会在管理端口上挂一个监听器stopserver 脚本通过 socket 连接上去发送指定命令。监听器收到命令后把停机任务提交给内部的事件流程依次触发应用各阶段的 shutdown 钩子全部结束后进程自然退出。这也是为什么 stopserver 偶尔会“停得慢”。一台机器上如果部署了多个应用每个应用都在执行销毁清理几十秒内进程退出都是正常的。怎么区分正常慢和卡死观察日志正常慢会有连续的清理日志最后出现 shutdown complete卡死通常是在某个清理阶段反复打同样的错误或者长时间没有任何新日志。4.3 日志重定向与 nohup 的差异很多从 Tomcat 转过来的同学会习惯用 nohup 去拉服务nohup ./startserver.sh /tmp/tongweb.log 21 短时间的临时调试可以生产环境我不推荐。原因在于中间件本身实现了日志文件管理、按天滚动、错误日志分离如果自己重定向到 /tmp等于绕过了原来的日志体系排错时还得额外找一份文件。还有同学问 startserver_noConsole 是不是就是 nohup其实两者层级不一样。noConsole 是产品层面的设计它仍然管理自己的日志输出nohup 是 shell 层面的转发。简单记noConsole 适合稳定驻留nohup 加 startserver 适合应急调试别混为一谈。5. 常见问题与排查技巧5.1 问题速查表症状检查项常见解法启动即退出无控制台窗口logs/server.log 尾部查看最近异常堆栈常见是配置错误或端口冲突端口被占用netstat -tlnp / lsof停掉占用进程或修改监听端口提示 JAVA_HOME not found检查环境变量设置 JAVA_HOME或在脚本内显式指定双击 bat 闪退在 cmd 窗口手动执行看具体报错中文乱码调整编码服务启动成功但访问 404检查应用是否部署成功确认部署目录形态与应用访问上下文停止超时查看 shutdown 日志分析卡在哪个清理环节GC 日志过大查看日志轮转配置开启 GC 日志滚动设置保留份数5.2 典型场景启动后立刻崩了怎么追启动后几秒钟进程就消失这是最常见的问题。我习惯按这个顺序排查先看 logs/server.log 的最后 200 行找 out of memory、ClassNotFoundException、ConfigurationException 这类关键错误。如果日志提示端口绑定失败用lsof -i:端口找到占用进程确认是不是之前残留的实例没退干净。如果日志提示配置解析错误用配置工具检查最近的改动可能是多加了一个不符合约束的配置项。如果日志在启动过程中反复出现 JDK 版本检查失败先java -version确认默认 JDK再确认 JAVA_HOME 指向是否正确。第 3 类情况多发于手工改配置文件。TongWeb8 的配置有严格的 schema 约束手工编辑时一个标签闭合错位启动脚本并不会帮你预校验而是等到解析配置时才报错。所以我一直建议能用配置工具就尽量用工具手工改完一定要保留一份启动日志做回归对照。5.3 端口、防火墙和监控入口部署到云服务器或内网服务器端口配置是一道关卡。TongWeb8 对外服务端口、管理控制台端口、shutdown 停机端口这三个最好都区分清楚。外网防火墙只开放业务端口控制台限内网访问停机端口更不能暴露否则任何人都能远程把服务器停掉。另外中间件启动时连接外部系统数据库、配置中心的超时设置也值得关心。TongWeb8 默认会在启动时尝试初始化数据源如果数据库不在线启动过程可能一直挂着。这时候除了看日志也可以先用最小配置把中间件拉起来再逐步加入数据源先定位是网络问题还是配置问题。这个方法我用了很多次效率一直很高。6. 生产环境利器systemd 集成与服务化6.1 Linux 下用 systemd 管理 TongWeb8既然 noConsole 脚本适合后台驻留下一步自然是用 systemd 把它管理起来。我一般会建一个专用的 tongweb 用户然后写一个 unit 文件[Unit] DescriptionTongWeb8 Application Server Afternetwork.target [Service] Usertongweb Grouptongweb WorkingDirectory/data/tongweb ExecStart/data/tongweb/bin/startserver_noConsole.sh ExecStop/data/tongweb/bin/stopserver.sh Restarton-failure RestartSec10 LimitNOFILE65535 [Install] WantedBymulti-user.target配置好后执行systemctl daemon-reload systemctl enable tongweb systemctl start tongweb systemctl status tongwebExecStop 直接指向 stopserver.sh 而不是 kill保证优雅关闭。Type 这里先用 simple 跑着观察如果发现 systemd 认为服务已退出但 Java 进程还活着说明 noConsole 脚本内部做了后台化这时候要把 Type 改成 forking并配置好 PIDFile。Restarton-failure 加上后进程闪退会被守护自动拉起对业务连续性很有帮助。6.2 Windows 服务模式的使用要领Windows 上注册服务后服务由系统服务管理器接管同样能实现开机自启和异常重启。使用有一个高频坑服务启动时找不到 JAVA_HOME。原因是 Windows 服务运行在独立会话里读不到用户在操作系统界面里设置的临时变量。解决办法是把 JAVA_HOME 完整路径写入系统环境变量或者在服务注册参数里显式指定。另外bat 脚本在中文 Windows 上偶尔会出现乱码。这往往是脚本文件编码和终端代码页不一致。先用编辑器确认脚本保存的编码再把终端的代码页调整到对应编码去调试不要直接凭感觉改脚本内容改错一个字符比乱码更难查。6.3 运维自动化的几个小习惯最后分享几个我实际在用的习惯都是文档里很少细讲但对稳定运维很有用的内容每次变更配置前先备份 bin、config、lib 三个目录下要改动的文件文件名加上时间戳。把 version.sh 和启动日志纳入巡检脚本每天检查一次版本号、启动时间、错误关键字。启动脚本和停止脚本保留只读权限避免日常误操作被改坏。多实例部署时用环境变量区分实例 ID日志路径和配置路径按实例隔离避免多个进程争抢同一份配置。我个人在每个新环境里都会做一次“三连操作”跑一遍 version.sh 确认版本跑一下 startserver 确认启动参数再跑 stopserver 确认能正常关闭。这三步不超过三分钟却能把环境 80% 的初始问题排查掉后续同事接手也少走弯路。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门