WildFly注册为systemd服务后启动即退出的问题求助
已完成部署操作:
- 将
wildfly.service复制至/etc/systemd/system/目录 - 将
wildfly.conf复制至/etc/wildfly/目录 - 将
launch.sh放置在wildfly/bin目录下
但执行systemctl start wildfly启动服务时,服务会立即退出,服务状态信息如下:
○ wildfly.service - The WildFly Application Server Loaded: loaded (/etc/systemd/system/wildfly.service; enabled; vendor preset: enabled) Active: inactive (dead) since Wed 2022-09-28 02:08:05 UTC; 10s ago Process: 3549 ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND (code=exited, status=0/SUCCESS) Main PID: 3549 (code=exited, status=0/SUCCESS) CPU: 49ms Sep 28 02:08:05 test4 systemd[1]: Started The WildFly Application Server. Sep 28 02:08:05 test4 systemd[1]: wildfly.service: Deactivated successfully.
直接执行/opt/wildfly/bin/launch.sh脚本时,WildFly可正常启动且能访问首页。当前wildfly.service配置内容:
[Unit] Description=The WildFly Application Server After=syslog.target network.target Before=httpd.service [Service] Environment=LAUNCH_JBOSS_IN_BACKGROUND=1 EnvironmentFile=-/etc/wildfly/wildfly.conf LimitNOFILE=102642 PIDFile=/run/wildfly/wildfly.pid ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND StandardOutput=null [Install] WantedBy=multi-user.target
解决步骤
添加服务类型配置:在
wildfly.service的[Service]段添加Type=forking。因为WildFly通过launch.sh启动后会fork出子进程运行,systemd默认会监控ExecStart指定的主进程,主进程退出后就会终止服务。设置Type=forking后,systemd会等待PIDFile中指定的进程启动,不再以launch.sh的退出作为服务结束的标志。修改后的[Service]段如下:[Service] Type=forking Environment=LAUNCH_JBOSS_IN_BACKGROUND=1 EnvironmentFile=-/etc/wildfly/wildfly.conf LimitNOFILE=102642 PIDFile=/run/wildfly/wildfly.pid ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND StandardOutput=null确保PID文件目录权限正确:检查
/run/wildfly目录是否存在,且WildFly运行用户拥有读写权限。如果目录不存在,执行以下命令创建并设置权限(假设WildFly使用wildfly用户运行,根据实际情况替换):sudo mkdir -p /run/wildfly sudo chown wildfly:wildfly /run/wildfly验证环境变量配置:确认
/etc/wildfly/wildfly.conf中的WILDFLY_MODE、WILDFLY_CONFIG、WILDFLY_BIND等变量设置与直接执行launch.sh时的环境一致,避免因环境变量缺失导致服务启动异常。重新加载配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart wildfly
执行systemctl status wildfly查看服务状态,若显示active (running),再访问WildFly首页确认服务正常运行。
内容的提问来源于stack exchange,提问作者Sidev

