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

2020 年 12 月 1 日
 zealinux

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

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

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

有没有合适的方法?

ubuntu 18.04 Java 1.8

8336 次点击
所在节点    程序员
59 条回复
wtks1
2020 年 12 月 1 日
最简单的,写个脚本监控,挂在定时任务里
deplives
2020 年 12 月 1 日
supervisor
cheng6563
2020 年 12 月 1 日
给你个 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
```
dushixiang
2020 年 12 月 1 日
@cheng6563 少写了 systemctl daemon-reload
xmge
2020 年 12 月 1 日
supervisor 这个很方便
chaffy
2020 年 12 月 1 日
crond 不就 OK 了吗,检测下进程
noqwerty
2020 年 12 月 1 日
我们现在图省事就全放 docker 了,如果单纯管理进程的话 systemd, supervisor, pm2 任选一个都可以,稳定性都很不错,这三个里面个人认为 pm2 最方便
Kirsk
2020 年 12 月 1 日
看起来都很麻烦 不用容器其他情况下 service 软链接 jar 包直接跑
zengming00
2020 年 12 月 1 日
pm2 start 可执行命令 -- 参数 // 参数前是两个连续的减号,这样参数才能传递进可执行命令
pm2 save // 保存当前运行的列表,这样在系统重启时才能自动恢复
julyclyde
2020 年 12 月 1 日
需要一个父进程监听 SIGCHLD 信号
nohup 显然是错误的,并不是一种选择
autogen
2020 年 12 月 1 日
jar 现在不都是放 docker 里跑吗
qbhy
2020 年 12 月 1 日
docker
Selenium39
2020 年 12 月 1 日
@zengming00 这个除了 nodejs,java 也能用的吗?
sagaxu
2020 年 12 月 1 日
我提供个简单方便的野路子

用 systemd 管理 supervisord,然后用 supervisord 管理 java 服务
guochao
2020 年 12 月 1 日
你问的这个问题一般由 supervisor 类应用解决。

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

容器勉勉强强也可以算作一类 supervisor,也支持一部分的资源管理和自动化嘛,比如说 docker 、podman 。而且也有多机方案,最典型的就是 k8s 、docker swarm 这类容器编排工具。
gesse
2020 年 12 月 1 日
还有更简单点 pm2
dorothyREN
2020 年 12 月 1 日
supervisor,systemd, pm2,tomcat
phoolean
2020 年 12 月 1 日
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 月 1 日
直接用 systemd 不就好了,整什么 pm2 supervisor 最后还不是依赖 systemd 。。
anansi
2020 年 12 月 1 日
supervisor

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

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

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

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

© 2021 V2EX