除了使用 nohup,生产环境如何启动 Java 应用?

2020-12-01 10:10:36 +08:00
 zealinux

现在都是使用nohup java -jar x.jar > /tmp/x.log 2>&1 &

但其实没考虑到一个问题,如果云上虚拟机器挂了,或重启了。(这个发生过) 就需要自己手动去启动。

如果事故发生再夜里,手动启动就相当痛苦。

有没有合适的方法?

ubuntu 18.04 Java 1.8

7006 次点击
所在节点    程序员
58 条回复
wtks1
2020-12-01 11:47:31 +08:00
最简单的,写个脚本监控,挂在定时任务里
deplives
2020-12-01 11:49:13 +08:00
supervisor
cheng6563
2020-12-01 11:56:39 +08:00
给你个 systemd 模板
把那几个空白处填上,改名 xxx.service,扔到 /etc/systemd/system 里,然后 systemctl start xxx 启动服务,systemctl enable xxx 开启自动启动

```
[Unit]
Description=
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=
User=
WorkingDirectory=
Restart=on-failure
RestartSec=3
StartLimitBurst=10

[Install]
WantedBy=multi-user.target
```
FreeEx
2020-12-01 12:00:11 +08:00
@cheng6563 少写了 systemctl daemon-reload
xmge
2020-12-01 12:02:43 +08:00
supervisor 这个很方便
chaffy
2020-12-01 12:04:02 +08:00
crond 不就 OK 了吗,检测下进程
noqwerty
2020-12-01 12:13:10 +08:00
我们现在图省事就全放 docker 了,如果单纯管理进程的话 systemd, supervisor, pm2 任选一个都可以,稳定性都很不错,这三个里面个人认为 pm2 最方便
Kirsk
2020-12-01 12:21:12 +08:00
看起来都很麻烦 不用容器其他情况下 service 软链接 jar 包直接跑
zengming00
2020-12-01 12:31:39 +08:00
pm2 start 可执行命令 -- 参数 // 参数前是两个连续的减号,这样参数才能传递进可执行命令
pm2 save // 保存当前运行的列表,这样在系统重启时才能自动恢复
julyclyde
2020-12-01 12:50:28 +08:00
需要一个父进程监听 SIGCHLD 信号
nohup 显然是错误的,并不是一种选择
autogen
2020-12-01 12:55:44 +08:00
jar 现在不都是放 docker 里跑吗
qbhy
2020-12-01 12:57:09 +08:00
docker
Selenium39
2020-12-01 13:00:15 +08:00
@zengming00 这个除了 nodejs,java 也能用的吗?
sagaxu
2020-12-01 13:03:11 +08:00
我提供个简单方便的野路子

用 systemd 管理 supervisord,然后用 supervisord 管理 java 服务
guochao
2020-12-01 13:08:01 +08:00
你问的这个问题一般由 supervisor 类应用解决。

最出名的就是 systemd 、supervisord 、sysv init 、upstart,不需要写很多脚本,本身就支持比如重启啊、依赖关系啊什么的。推荐直接上手 systemd,除非版本不一样,系统间差异较小且稳定,对于进程服务之外的资源依赖也可以处理到。都是单机的

容器勉勉强强也可以算作一类 supervisor,也支持一部分的资源管理和自动化嘛,比如说 docker 、podman 。而且也有多机方案,最典型的就是 k8s 、docker swarm 这类容器编排工具。
gesse
2020-12-01 13:32:09 +08:00
还有更简单点 pm2
dorothyREN
2020-12-01 13:32:32 +08:00
supervisor,systemd, pm2,tomcat
phoolean
2020-12-01 13:34:42 +08:00
pid=$(ps | grep java | grep -v grep | awk '{print $1}')
#获取 java 的 pid
if [ -z "$pid" ]
#如果挂了
then nohup java -jar x.jar > /tmp/x.log 2>&1 &
#重启 java
fi
然后让脚本在 cron 里每分钟执行一次
fuis
2020-12-01 13:46:11 +08:00
直接用 systemd 不就好了,整什么 pm2 supervisor 最后还不是依赖 systemd 。。
anansi
2020-12-01 14:19:46 +08:00
supervisor

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

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

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

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

© 2021 V2EX