首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统在YAJSW包装器启动后找不到PID文件

系统在YAJSW包装器启动后找不到PID文件
EN

Unix & Linux用户
提问于 2018-04-12 10:30:18
回答 2查看 1.9K关注 0票数 0

我有一个基于systemd的分叉服务的foo启动脚本(让我们称之为D1)。.service文件的相关部分如下所示:

代码语言:javascript
复制
ExecStart=/opt/foo/startup.sh
ExecStop=/opt/foo/shutdown.sh
Restart=always    
Type=forking
PIDFile=/opt/foo/wrapper.pid

startup.sh脚本负责启动YAJSW包装器。设置YAJSW配置文件,以便在启动时将其PID写入文件:

代码语言:javascript
复制
 wrapper.pidfile = /opt/foo/wrapper.pid

这样,如果包装过程(由于任何原因)死亡,systemd应该启动它,这是所需的行为。我已经验证了这个配置是正确的,但是在日志中显示了一个奇怪的行:

代码语言:javascript
复制
foo.service: PID file /opt/foo/wrapper.pid not readable (yet?) after start: No such file or directory

奇怪的是,systemctl状态foo正确地显示了主PID:

代码语言:javascript
复制
foo.service
...
Main PID: 12313 (java)

我是不是做错了什么,还是这是软件组件中的一个bug?我正在运行Ubuntu16.04.3LTS,内核版本4.4.0,systemd版本229.4。任何帮助都将不胜感激。

EN

回答 2

Unix & Linux用户

发布于 2018-04-13 07:57:23

将分叉服务YAJSW (又一个Java ) ExecStart=/opt/foo/startup.sh ExecStop=/opt/foo/shutdown.sh PID写入文件

这类东西在Java中很流行,实际上在一般的Oracle系统中也很流行,但也完全没有必要。您不需要使用shell脚本或Java编写的可怜人的服务管理器在实际的服务管理器下面运行。PID文件是一个完全危险和摇摇欲坠的机制。您不需要startup.shshutdown.sh脚本,它们最终会将实际的服务流程推倒在流程树中而没有好的结果。您不需要额外的YAJSW配置文件。您不需要基于内存中标准输出的复杂和特殊的日志记录机制。

您的服务流程应该由实际的服务管理直接管理,并且不会使用systemd分叉准备协议,因为野生环境中几乎没有实际使用它。不要使用包装外壳脚本运行可怜人的服务管理器。不要使用PID文件。任何shell脚本包装都应该是链式加载,而不是叉子。您的配置文件是systemd服务单元文件,而不是其他配置文件。您的日志记录机制是随服务管理而来的,它捕获标准输出和标准错误并将它们的数据写入文件。

再读

票数 2
EN

Unix & Linux用户

发布于 2018-04-12 18:22:41

我不认为这是一个bug,而是一个复杂的问题。您现在拥有这条链,只用于启动和管理您的应用程序:

代码语言:javascript
复制
systemd -> startup.sh -> YAJSW -> actual app

我不知道startup.sh和YAJSW到底在做什么,但最好尝试简化管理:

代码语言:javascript
复制
systemd -> actual app

那么,如果管理层有问题,对发生的事情进行推理就会容易得多。

我建议通过最大限度地利用systemd进行管理,并最小化或消除脚本和YAJSW正在做的事情来简化这种情况。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/437251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档