joh*_*ohn 2 linux tomcat systemd centos-7
我安装了Tomcat 8.5,我可以手动成功启动它,例如:
su tomcat startup.sh
Run Code Online (Sandbox Code Playgroud)
工作正常,tomcat 能够在端口 8080 上提供服务。
我需要自动启动,所以我创建了文件/etc/systemd/system/tomcat-prod.service:
[Unit]
Description=Tomcat 8.5 servlet container - Production
After=network.target
[Service]
Type=forking
ExecStart=/opt/appservers/production/apache-tomcat-8.5.37/bin/startup.sh
ExecStop=/opt/appservers/production/apache-tomcat-8.5.37/bin/shutdown.sh
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
该文件是故意裸露的,我所有的环境变量都在 setenv.sh 中。我尝试使用以下方法运行它:
# systemctl daemon-reload
# systemctl start tomcat-prod
Run Code Online (Sandbox Code Playgroud)
由于上述原因,Tomcat 在启动后立即退出。我在任何地方都没有得到任何解释原因的日志。Tomcat 在启动时创建一个空的 catalina.out 文件,并且 systemctl status tomcat-prod 仅提供以下内容:
tomcat-prod.service - Tomcat 8.5 servlet 容器 - 生产加载:已加载(/etc/systemd/system/tomcat-prod.service;启用;供应商预设:禁用)活动:自 2019 年星期五以来失败(结果:退出代码)- 01-04 08:08:27 UTC;3s前进程:3583 ExecStop=/opt/appservers/production/apache-tomcat-8.5.37/shutdown.sh (code=exited, status=203/EXEC) 进程:3569 ExecStart=/opt/appservers/production/apache- tomcat-8.5.37/bin/startup.sh (code=exited, status=0/SUCCESS) Main PID: 3581 (code=exited, status=0/SUCCESS)
Jan 04 08:08:27 *.net startup.sh[3569]:启动期间发现现有 PID 文件。Jan 04 08:08:27 *.net startup.sh[3569]:删除/清除陈旧的 PID 文件。
有人可以指出我正确的方向吗?
小智 5
毫无疑问,grawity 已经意识到了作者在其他地方提到的systemd 的恐惧,其中作者写道“我们已经有了一个更好的守护进程主管。它是 systemd”——这意味着我们也不需要 jsvc。然而,在该页面上,作者确实添加了“Bonus Track”:“请注意,M. Benjamin 使用 run 而不是 start 调用 catalina.sh。实际上还有另一条路径通过 catalina.sh,用于旨在运行守护进程的系统,不要产生它们。” 对 Jonathan de Boyne Pollard 的脚本进行一些调整后,我得出以下结论:a ) 不太难写,b ) 似乎消除了不必要的功能层,
# file: /usr/local/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target
[Service]
User=tomcat
Group=tomcat
ExecStart=/opt/apache/tomcat/bin/catalina.sh run
Type=simple
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0
# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM
# Java process is never killed
SendSIGKILL=no
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
有关其他选项,请参阅 catalina.sh 脚本的顶部,其中显示:
# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
Run Code Online (Sandbox Code Playgroud)