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

2023-09-21 09:36:18 +08:00
 sankooc

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

3921 次点击
所在节点    Java
37 条回复
securityCoding
2023-09-21 09:48:17 +08:00
感觉你要的是 docker
aladdinding
2023-09-21 09:50:30 +08:00
systemctl
k8s
salmon5
2023-09-21 09:55:45 +08:00
supervisor
tgyday
2023-09-21 09:55:49 +08:00
supervisord 可以实现进程管理和自动重启异常重启报警等
imzcc
2023-09-21 10:00:11 +08:00
supervisor +1
sankooc
2023-09-21 10:01:41 +08:00
@securityCoding @aladdinding 由于服务器资源是已经分配好的一个服务器部署一个服务 所以不好说服他们服务器里装个 docker 跑一个 java 服务 systemctl 有启动失败 发送警告的模块么?
wind1986
2023-09-21 10:08:56 +08:00
uptime kuma + 健康检查, 适合任何项目
dsioahui2
2023-09-21 10:11:08 +08:00
@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
2023-09-21 10:20:46 +08:00
没用 systemd 的原因是,业务 java 和系统的管理有耦合,管理起来有一些噪音
salmon5
2023-09-21 10:22:25 +08:00
健康检查肯定是 k8s 的功能最完善,但是如果是几个单体应用,用 k8s 有点重
chendy
2023-09-21 10:50:37 +08:00
虽然但是一个 & 好像就够了
除非写得差有内存泄露,或者服务器内存短缺被 oomkill 否则 java 进程基本不会死
darkengine
2023-09-21 11:42:18 +08:00
我们有个项目就是 nohup java -server 起的。。。
kpingdd
2023-09-21 11:46:37 +08:00
或许可以看看 zabbix 之类的
zliea
2023-09-21 19:30:45 +08:00
如果节点不多 docker swarm 也可以的
Pursue9
2023-09-22 01:07:46 +08:00
@sankooc 你这个太适合 docker compose 部署了, 有版本管控,每次更新也只用拉取下镜像 up -d --build
julyclyde
2023-09-23 18:38:28 +08:00
pm2 、supervisorD 、nohup 之类的肯定是不对的
容器、systemd 是仅有的正确答案


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


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

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