我为java应用程序设置了systemd服务.一切正常,直到java应用程序重新启动.重新启动时,systemd观察到的主要java进程以状态0退出并启动自身的新实例. Systemd现在认为该过程已退出.
如何告诉systemd重启java应用程序启动的进程的新PID?
我如何获得新推出的流程的PID?
systemd服务定义如下:
[Unit]
Description=MyJavaApp
After=network.target
[Service]
Type=simple
User=myuser
ExecStart=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar &
ExecStop=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar -quit
[Install]
WantedBy=multi-user.target
解决方法:
不幸的是你不能.使用type = simple,systemd跟踪由ExecStart参数直接执行的进程.虽然type = forking仍会有类似的问题,因为systemd会跟踪进程,并且一旦退出,systemd就会认为它已经死了.
这方面的困难在于systemd无法知道这是您的应用程序的正常行为.可能是您的应用程序具有主进程,然后生成子工作进程.因此,systemd会认为你的主人已经死了,并留下一些需要清理的孩子.
有两种方法可以解决这个问题:
>以某种方式创建systemd执行的监视器进程,此进程启动您的应用程序.然后以某种方式让这个监视器进程能够分辨出应用程序退出与fork-exit之间的区别.这可能相当难以实现,因为跟踪子进程的子进程并不容易.
可能有效的一种方法是创建一个匿名管道,将管道的写端传递给进程,并在读取端等待EOF.只要您的应用程序不关闭未知的文件描述符,它应该工作.
>将您的应用程序更改为使用exec而不是fork exec.这样,新进程使用与旧进程相同的PID.
原文地址:https://codeday.me/bug/20190814/1658243.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。