如何实现WSO2AM进程自动重启?排查Ubuntu下重启失效问题
排查Ubuntu中WSO2AM进程自动重启失效问题
首先得明确你的Ubuntu系统正在使用的初始化系统:Ubuntu 16.04及以后版本默认用systemd,14.10及以前则用Upstart。你同时提供了两种配置文件,得先确认当前生效的是哪一套,再针对性排查。
一、先确认当前初始化系统
执行命令判断:
ps -p 1 -o comm=
输出systemd就是用systemd,输出init则是Upstart。
二、针对Systemd配置的排查(多数现代Ubuntu适用)
你提供的systemd服务文件路径是/usr/lib/systemd/system/wso2am.service(或/lib/systemd/system/wso2am.service),先解决配置里的问题,再验证重启机制:
1. 修正服务文件的明显错误
你的配置里有几个会导致失效的问题:
After==network.target wso2am.service:多了一个等号,且不能依赖自身服务(会造成循环),应改为After=network.targetRemainAfterExit=true:这个参数适合一次性执行的服务,和你的Type=simple不匹配,会让systemd误判服务状态wso2server.sh --start通常会让进程后台运行,systemd的Type=simple要求主进程前台运行,否则systemd会认为进程已退出
修正后的配置示例:
# /usr/lib/systemd/system/wso2am.service [Unit] Description=wso2am server daemon Documentation=https://docs.wso2.com/ After=network.target [Service] User=tel Group=tel TimeoutStartSec=0 Type=simple KillMode=process ExecStart=/bin/bash -lc '/home/tel/Documents/vz/wso2am-2.1.0/wso2am-2.1.0/bin/wso2server.sh' ExecStop=/bin/bash -lc '/home/tel/Documents/vz/wso2am-2.1.0/wso2am-2.1.0/bin/wso2server.sh --stop' StandardOutput=journal Restart=always RestartSec=2 [Install] WantedBy=default.target
2. 验证systemd重启机制
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启用并启动服务:
sudo systemctl enable --now wso2am.service - 查看服务状态,确认重启策略生效:
输出里能看到sudo systemctl status wso2am.serviceRestart=always的配置,以及服务当前状态。 - 实时监控日志,手动杀进程后观察是否重启:
执行sudo journalctl -u wso2am.service -fkill -9 <pid>杀死进程后,看日志里是否有重启相关的记录。
3. 核心问题说明
用kill -9强制杀进程后,systemd是否重启取决于:
- 它能监控到主进程的退出:如果脚本后台启动WSO2AM,systemd监控的是bash脚本进程,而非WSO2AM实际进程——脚本退出后,systemd会误判服务状态,不会重启真实的业务进程。
- 解决办法:要么修改
wso2server.sh让它前台运行(多数Java服务可加-Dfork=false类参数),要么把服务Type改成forking,让systemd追踪fork出的子进程。
三、针对Upstart配置的排查(旧版Ubuntu)
你的Upstart脚本路径是/etc/init/wso2am.conf,先修正配置问题:
1. 修正Upstart脚本
你的脚本里没有实际启动WSO2AM的有效命令,且注释了exec行,这肯定无法启动进程,更别说重启了。修正后的示例:
# Ubuntu upstart file at /etc/init/wso2am.conf #!upstart description "wso2am" pre-start script mkdir -p /var/log/wso2am/ end script respawn respawn limit 15 5 start on runlevel [2345] stop on runlevel [06] script export JAVA_HOME="/usr/lib/jvm/jdk1.8.0_111" # 必须用前台启动命令,不能后台运行 exec /home/tel/Documents/vz/wso2am-2.1.0/wso2am-2.1.0/bin/wso2server.sh end script
2. 验证Upstart重启机制
- 启动服务:
sudo start wso2am - 查看服务状态:
sudo status wso2am - 查看Upstart日志:
cat /var/log/upstart/wso2am.log - 手动杀进程后,用
status wso2am确认是否自动重启,或查看日志里的重启记录。
3. 核心问题说明
Upstart的respawn只监控script块里exec启动的主进程,如果脚本后台启动WSO2AM,Upstart会认为主进程已退出,不会触发重启。必须让exec启动的进程前台运行,Upstart才能监控并重启。
四、通用排查要点
- 确认进程归属:用
ps -ef | grep wso2am找到的进程,必须是初始化系统(systemd/Upstart)启动的子进程,手动启动的进程不会被监控。 - 日志优先排查:不管是systemd的journal还是Upstart的日志,都会记录重启失败的原因(比如配置错误、权限不足、进程退出原因等)。
- 权限检查:确保
tel用户有足够权限启动WSO2AM,以及读写日志目录、安装目录的权限。
内容的提问来源于stack exchange,提问作者VIVEK-MDU
相关产品推荐
相关产品推荐

