现在都是使用nohup java -jar x.jar > /tmp/x.log 2>&1 &
但其实没考虑到一个问题,如果云上虚拟机器挂了,或重启了。(这个发生过) 就需要自己手动去启动。
如果事故发生再夜里,手动启动就相当痛苦。
有没有合适的方法?
ubuntu 18.04 Java 1.8
1
echowuhao 2020-12-01 10:12:40 +08:00 2
systemd
|
2
kiddingU 2020-12-01 10:13:10 +08:00 2
很多呀,比如 supervisor
|
3
securityCoding 2020-12-01 10:13:56 +08:00
多节点部署,简单点前面可以挂个 nginx 定时检查 api,单节点再折腾也没法保证高可用性。
|
4
Xusually 2020-12-01 10:15:12 +08:00
自己写一套 systemctl 脚本,或者用 systemd
|
5
JokerLiang 2020-12-01 10:15:19 +08:00
上 docker
|
6
yalin 2020-12-01 10:15:48 +08:00
system V
|
7
cike 2020-12-01 10:17:37 +08:00
systemd
supervisor |
8
msg7086 2020-12-01 10:18:13 +08:00 via Android
用正确的方法呗(指用服务管理器)。
|
9
GM 2020-12-01 10:26:01 +08:00
java service wrapper,a.k.a jsw 值得你拥有。
|
10
dark3212 2020-12-01 10:29:39 +08:00
supervisor
就算用 nohup 你也可以添加到开机启动命令里来达到重启自动启动的效果。 |
11
40EaE5uJO3Xt1VVa 2020-12-01 10:42:00 +08:00
systemd 开机自启动
开始我还以为要后台运行,用 nohup |
12
xiaoz 2020-12-01 10:48:08 +08:00 via Android
systemd 吧,挺方便的。
|
13
zifangsky 2020-12-01 10:50:37 +08:00
这个帖子不错,很有参考价值,感谢各位的回答!
|
14
FullBridgeRect 2020-12-01 10:52:50 +08:00 via Android
systemd supervisord 这些服务管理器都不错
|
15
kiddingU 2020-12-01 10:52:58 +08:00
systemd supervisor docker k8s 都行~~
|
16
Cbdy 2020-12-01 11:03:30 +08:00
systemd
|
17
kingfalse 2020-12-01 11:13:47 +08:00 via Android 1
搞个简单的 shell 脚本死循环,完美解决
#!/bin/bash while [ 1 ] do java -jar xxx.jar done |
18
kingfalse 2020-12-01 11:14:12 +08:00 via Android
一个敢死,一个敢埋,稳的一批
|
19
oneisall8955 2020-12-01 11:28:15 +08:00
@kingfalse #17 你的操作 666 !
|
20
Weixiao0725 2020-12-01 11:44:44 +08:00
java 这种已经屏蔽底层的语言还要外面再包个 docker,套娃吗?
|
21
wtks1 2020-12-01 11:47:31 +08:00 via Android
最简单的,写个脚本监控,挂在定时任务里
|
22
deplives 2020-12-01 11:49:13 +08:00
supervisor
|
23
cheng6563 2020-12-01 11:56:39 +08:00 10
给你个 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 ``` |
25
xmge 2020-12-01 12:02:43 +08:00
supervisor 这个很方便
|
26
chaffy 2020-12-01 12:04:02 +08:00
crond 不就 OK 了吗,检测下进程
|
27
noqwerty 2020-12-01 12:13:10 +08:00
我们现在图省事就全放 docker 了,如果单纯管理进程的话 systemd, supervisor, pm2 任选一个都可以,稳定性都很不错,这三个里面个人认为 pm2 最方便
|
28
Kirsk 2020-12-01 12:21:12 +08:00 via Android
看起来都很麻烦 不用容器其他情况下 service 软链接 jar 包直接跑
|
29
zengming00 2020-12-01 12:31:39 +08:00
pm2 start 可执行命令 -- 参数 // 参数前是两个连续的减号,这样参数才能传递进可执行命令
pm2 save // 保存当前运行的列表,这样在系统重启时才能自动恢复 |
30
julyclyde 2020-12-01 12:50:28 +08:00
需要一个父进程监听 SIGCHLD 信号
nohup 显然是错误的,并不是一种选择 |
31
autogen 2020-12-01 12:55:44 +08:00
jar 现在不都是放 docker 里跑吗
|
32
qbhy 2020-12-01 12:57:09 +08:00
docker
|
33
Selenium39 2020-12-01 13:00:15 +08:00
@zengming00 这个除了 nodejs,java 也能用的吗?
|
34
sagaxu 2020-12-01 13:03:11 +08:00 via Android 1
我提供个简单方便的野路子
用 systemd 管理 supervisord,然后用 supervisord 管理 java 服务 |
35
guochao 2020-12-01 13:08:01 +08:00
你问的这个问题一般由 supervisor 类应用解决。
最出名的就是 systemd 、supervisord 、sysv init 、upstart,不需要写很多脚本,本身就支持比如重启啊、依赖关系啊什么的。推荐直接上手 systemd,除非版本不一样,系统间差异较小且稳定,对于进程服务之外的资源依赖也可以处理到。都是单机的 容器勉勉强强也可以算作一类 supervisor,也支持一部分的资源管理和自动化嘛,比如说 docker 、podman 。而且也有多机方案,最典型的就是 k8s 、docker swarm 这类容器编排工具。 |
36
gesse 2020-12-01 13:32:09 +08:00 via iPhone
还有更简单点 pm2
|
37
dorothyREN 2020-12-01 13:32:32 +08:00
supervisor,systemd, pm2,tomcat
|
38
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 里每分钟执行一次 |
39
fuis 2020-12-01 13:46:11 +08:00
直接用 systemd 不就好了,整什么 pm2 supervisor 最后还不是依赖 systemd 。。
|
40
anansi 2020-12-01 14:19:46 +08:00
supervisor
|
41
akira 2020-12-01 14:21:12 +08:00
别抢运维的活。。
|
42
3t 2020-12-01 14:34:19 +08:00
最近上手了 pm2,改两行配置代码就行了,自带自动重启
|
43
Illusionary 2020-12-01 14:47:18 +08:00
2021 年了还不上 docker ?
|
44
namelosw 2020-12-01 16:04:51 +08:00
怕吗? 怕就 Kubernetes.
|
45
chenhbang 2020-12-01 17:26:31 +08:00
systemd . supervisor . docker
|
46
wongy 2020-12-01 17:29:19 +08:00 via iPhone
https://github.com/mojohaus/appassembler
Java Service Wrapper 是我目前使用的打包执行工具 |
47
Fanx 2020-12-01 18:32:29 +08:00
写 systemd
|
48
zengming00 2020-12-01 20:42:08 +08:00
@Selenium39 以前 pm2 是 nodejs 专用,现在 pm2 已经是通用的了
|
49
dooonabe 2020-12-01 21:36:48 +08:00 via Android
setsid
|
50
sampeng 2020-12-01 21:43:47 +08:00 via iPhone
生产环境表示干了十年也没用 nohub 跑业务。临时几分钟脚本偶尔用
|
51
yishenggudou 2020-12-01 22:10:22 +08:00
supervisor 正解
|
52
IgniteWhite 2020-12-02 06:15:11 +08:00 via iPhone
介于 nohup 和 service 之间还可以写个开机启动的 tmux 脚本
|
53
FlexGap 2020-12-02 09:56:27 +08:00
实在嫌烦就上 PM2
|
54
goodboy95 2020-12-02 10:02:54 +08:00
以前用 supervisor,后来公司开始大力推 docker (不过让我们连 nginx 都搭在 docker 上是我万万没有想到的,我过了一年都没想出这么干有什么好处)
|
56
julyclyde 2020-12-02 11:27:06 +08:00
@IgniteWhite 这个显然不靠谱
|
57
IgniteWhite 2020-12-03 03:42:09 +08:00 via iPhone
@julyclyde 资源占用来说 tmux session 当然比系统 service 稍大,但是靠谱不靠谱得看脚本怎么写。不过脚本如果做成了 service 用 tmux 就没有意义了
|
58
ql562482472 2023-07-10 20:07:38 +08:00
@goodboy95 2 年半了 你明白有什么好处了吗
|