我有一个基于systemd的分叉服务的foo启动脚本(让我们称之为D1)。.service文件的相关部分如下所示:
ExecStart=/opt/foo/startup.sh
ExecStop=/opt/foo/shutdown.sh
Restart=always
Type=forking
PIDFile=/opt/foo/wrapper.pidstartup.sh脚本负责启动YAJSW包装器。设置YAJSW配置文件,以便在启动时将其PID写入文件:
wrapper.pidfile = /opt/foo/wrapper.pid这样,如果包装过程(由于任何原因)死亡,systemd应该启动它,这是所需的行为。我已经验证了这个配置是正确的,但是在日志中显示了一个奇怪的行:
foo.service: PID file /opt/foo/wrapper.pid not readable (yet?) after start: No such file or directory奇怪的是,systemctl状态foo正确地显示了主PID:
foo.service
...
Main PID: 12313 (java)我是不是做错了什么,还是这是软件组件中的一个bug?我正在运行Ubuntu16.04.3LTS,内核版本4.4.0,systemd版本229.4。任何帮助都将不胜感激。
发布于 2018-04-13 07:57:23
将分叉服务YAJSW (又一个Java )
ExecStart=/opt/foo/startup.shExecStop=/opt/foo/shutdown.shPID写入文件
这类东西在Java中很流行,实际上在一般的Oracle系统中也很流行,但也完全没有必要。您不需要使用shell脚本或Java编写的可怜人的服务管理器在实际的服务管理器下面运行。PID文件是一个完全危险和摇摇欲坠的机制。您不需要startup.sh和shutdown.sh脚本,它们最终会将实际的服务流程推倒在流程树中而没有好的结果。您不需要额外的YAJSW配置文件。您不需要基于内存中标准输出的复杂和特殊的日志记录机制。
您的服务流程应该由实际的服务管理直接管理,并且不会使用systemd分叉准备协议,因为野生环境中几乎没有实际使用它。不要使用包装外壳脚本运行可怜人的服务管理器。不要使用PID文件。任何shell脚本包装都应该是链式加载,而不是叉子。您的配置文件是systemd服务单元文件,而不是其他配置文件。您的日志记录机制是随服务管理而来的,它捕获标准输出和标准错误并将它们的数据写入文件。
发布于 2018-04-12 18:22:41
我不认为这是一个bug,而是一个复杂的问题。您现在拥有这条链,只用于启动和管理您的应用程序:
systemd -> startup.sh -> YAJSW -> actual app我不知道startup.sh和YAJSW到底在做什么,但最好尝试简化管理:
systemd -> actual app那么,如果管理层有问题,对发生的事情进行推理就会容易得多。
我建议通过最大限度地利用systemd进行管理,并最小化或消除脚本和YAJSW正在做的事情来简化这种情况。
https://unix.stackexchange.com/questions/437251
复制相似问题