现在都是使用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 ![]() systemd |
2 kiddingU 2020-12-01 10:13:10 +08:00 ![]() 很多呀,比如 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 ![]() 搞个简单的 shell 脚本死循环,完美解决 #!/bin/bash while [ 1 ] do java -jar xxx.jar done |
![]() | 18 kingfalse 2020-12-01 11:14:12 +08:00 via Android 一个敢死,一个敢埋,稳的一批 |
![]() | 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 ![]() 给你个 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 // 保存当前运行的列表,这样在系统重启时才能自动恢复 |
![]() | 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 ![]() 我提供个简单方便的野路子 用 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 |
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 年半了 你明白有什么好处了吗 |