大家的 Java 服务的进程管理是如何做到的

235 天前
 sankooc

本人原来是做 nodejs 的今年开始帮忙朋友的 java 项目做做运维 由于我自己的技术栈限制当前的 java 项目是靠 pm2 管理的 随着部署服务的数量增多现在有监控各个服务器 pm2 状态和报警的需求 我看了下 pm2 的 monitor 功能是收费且不能 selfhost 的 大家有没有 pm2 monitor 的竞品推荐 或者说 java 的进程管理工具主要的功能需求是 服务的自动重启 报警等等

3612 次点击
所在节点    Java
37 条回复
securityCoding
235 天前
感觉你要的是 docker
aladdinding
235 天前
systemctl
k8s
salmon5
235 天前
supervisor
tgyday
235 天前
supervisord 可以实现进程管理和自动重启异常重启报警等
imzcc
235 天前
supervisor +1
sankooc
235 天前
@securityCoding @aladdinding 由于服务器资源是已经分配好的一个服务器部署一个服务 所以不好说服他们服务器里装个 docker 跑一个 java 服务 systemctl 有启动失败 发送警告的模块么?
wind1986
235 天前
uptime kuma + 健康检查, 适合任何项目
dsioahui2
235 天前
@sankooc 以下基于文心一言的回答:
要使用 systemctl 管理进程并在启动失败时发送告警邮件,你可以遵循以下步骤:

创建一个服务单元文件,该文件描述了要管理的进程。你可以使用 systemctl 命令创建一个新的服务单元文件,例如:

bash
sudo nano /etc/systemd/system/myservice.service
在服务单元文件中,输入以下内容:

plaintext
[Unit]
Description=My Service
After=network.target

[Service]
ExecStart=/path/to/your/program
Restart=always

[Install]
WantedBy=multi-user.target
替换/path/to/your/program 为你要管理的进程的实际路径。
3. 保存并关闭文件。

重新加载 systemd 以加载新的服务单元:

bash
sudo systemctl daemon-reload
启用服务,使其在系统启动时自动启动:

bash
sudo systemctl enable myservice
启动服务:

bash
sudo systemctl start myservice
检查服务状态以确认是否成功启动:

bash
sudo systemctl status myservice
如果服务启动失败,你可以查看日志以获取更多信息:

bash
sudo journalctl -u myservice
配置告警邮件。你可以使用 OnFailure 指令在服务单元文件中指定一个脚本,该脚本将在服务启动失败时执行。这个脚本可以发送告警邮件。例如,创建一个名为 send_alert.sh 的脚本,并在其中编写发送邮件的代码。然后,将脚本的路径添加到服务单元文件中:

plaintext
[Unit]
Description=My Service
After=network.target
OnFailure=/path/to/send_alert.sh

[Service]
ExecStart=/path/to/your/program
Restart=always

[Install]
WantedBy=multi-user.target
重新加载 systemd 并重新启动服务:

bash
sudo systemctl daemon-reload
sudo systemctl restart myservice
如果服务启动失败,OnFailure 中指定的脚本将被执行,并发送告警邮件。
salmon5
235 天前
没用 systemd 的原因是,业务 java 和系统的管理有耦合,管理起来有一些噪音
salmon5
235 天前
健康检查肯定是 k8s 的功能最完善,但是如果是几个单体应用,用 k8s 有点重
chendy
235 天前
虽然但是一个 & 好像就够了
除非写得差有内存泄露,或者服务器内存短缺被 oomkill 否则 java 进程基本不会死
darkengine
235 天前
我们有个项目就是 nohup java -server 起的。。。
kpingdd
235 天前
或许可以看看 zabbix 之类的
zliea
235 天前
如果节点不多 docker swarm 也可以的
Pursue9
235 天前
@sankooc 你这个太适合 docker compose 部署了, 有版本管控,每次更新也只用拉取下镜像 up -d --build
julyclyde
233 天前
pm2 、supervisorD 、nohup 之类的肯定是不对的
容器、systemd 是仅有的正确答案


@salmon5
@tgyday
@imzcc
supervisorD 本身的存活,又由谁来保证呢?
supervisorD 重启动之后,上辈子启动的下属服务会脱离管理,造成端口占用之类的问题


@kpingdd 这事和 zabbix 没啥关系吧?

@darkengine nohup.out 把硬盘装满之后,你会删除它吗?
salmon5
232 天前
@julyclyde supervisor 本身不处理业务,相当稳定;重启后子进程也会跟着重启,子进程不会成为孤儿进程。
它有一些不足,健康检查不支持 k8s 类似 startupProbes 的逻辑;不支持 cgroup 。
管理非容器的 java springboot 应用还是很实用的。
julyclyde
231 天前
@salmon5 它自己如果是正常重启,会连累被管理的服务一起(白白多一次)重启;它自己如果是 SIGKILL 的话,里面的进程就漏出去了
salmon5
230 天前
@julyclyde supervisor 安装好后,需要调大下 minfds=,默认 1024 太小会被子进程继承,然后不太需要重启;它自己不处理业务,内存占用 10 多 M ,被 OOM 的概率也极低;
这 2 种情况概率极低,比上层业务的 bug 概率低多了,瑕不掩瑜吧,个人觉得是个不错的进程管理工具。
当然容器和 systemd 都是不错的选择,看需求和时间。
darkengine
230 天前
@julyclyde nohup.out 把硬盘装满之后,你会删除它吗?
------
搞了个定时任务删

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX