我在可视化 AIX 服务的状态时遇到了问题。因此,首先我创建一个指向将用于运行的 shell 脚本的子系统。
mkssys -s testService -p /etc/rc.d/init.d/runScriptWithCatalina.sh -u 0
现在,如果我将服务启动为
startsrc -s testService -a "start"
,则表明子系统已启动。
0513-059 The testService Subsystem has been started. Subsystem PID is 9502912.
而且服务确实有效。但是,当我用 检查子系统状态时
lssrc -a
,它显示它不工作。我发现这背后的原因是当子系统启动时,它调用 runScriptWithCatalina.sh ,它调用 catalina.sh 脚本启动,catalina.sh 分叉并创建新进程,而子系统无法检测到它,这就是为什么它表明它不起作用。这是卡特琳娜脚本 -https://github.com/magro/msm-sample-webapp/blob/master/runtime/apache-tomcat-6.0.32/bin/catalina.sh。 tomcad.pid 文件包含与显示的子系统 PID 9502912 不同的 pid。
有没有解决方案或解决方法,或者其他方法?
答案1
系统资源控制器是就其而言,显示正确的状态——它启动的 PID 现在已经退出。我对让 SRC 指示您的预期状态的最佳建议是确保脚本链exec
的每个后续脚本,以便尾端 java 进程占用与初始脚本相同的 PID。
精简示例:
文件:runScriptWithCatalina.sh
# ...
exec /path/to/catalina.sh
文件:/path/to/catalina.sh
# ...
exec java ...
答案2
catalina.sh
在 systemd 的恐怖屋里,今天适用于 systemd 的东西已经适用于 IBM 系统资源控制器30年。我实际上在我的一个常见答案中引用了一本 IBM 红皮书,它告诉人们编写在 SRC 下运行的守护进程的正确方法,这同样适用于其他系统,早在1995年。
使用catalina.sh
's bodge Poor Man's Dæmon Supervisor 和 Bad Logger 不是正确的方法。
包裹catalina.sh
在其他脚本是明确地这不是正确的方法。我说过不要使用该rc
脚本https://unix.stackexchange.com/a/563486/5132。
最好的办法就是摆脱掉catalina.sh
。去掉所有“Poor Man's Dæmon Supervisor”和“Bad Logger”的东西,或者与 AIX 完全无关的东西,您会发现它所做的事情很少,只是设置一些环境变量,然后运行命令java
。这个可以直接做,很多人做直接它。
稍微较差的方法是使用run
动词 for catalina.sh
。
进一步阅读
- 乔纳森·德博因·波拉德 (2001)。 设计 Unix 守护程序时要避免的错误。常见答案。
- 乔纳森·德博因·波拉德 (2015)。将 Apache Tomcat 包装在许多无意义的额外层中 systemd 恐怖屋。
- 使用 systemd 配置 java 守护进程
- https://unix.stackexchange.com/a/437461/5132
- https://unix.stackexchange.com/a/476608/5132