除了使用 nohup,生产环境如何启动 Java 应用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zealinux
V2EX    程序员

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

  •  
  •   zealinux 2020-12-01 10:10:36 +08:00 7529 次点击
    这是一个创建于 1775 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    有没有合适的方法?

    ubuntu 18.04 Java 1.8

    58 条回复    2023-07-10 20:07:38 +08:00
    echowuhao
        1
    echowuhao  
       2020-12-01 10:12:40 +08:00   2
    systemd
    kiddingU
        2
    kiddingU  
       2020-12-01 10:13:10 +08:00   2
    很多呀,比如 supervisor
    securityCoding
        3
    securityCoding  
       2020-12-01 10:13:56 +08:00
    多节点部署,简单点前面可以挂个 nginx 定时检查 api,单节点再折腾也没法保证高可用性。
    Xusually
        4
    Xusually  
       2020-12-01 10:15:12 +08:00
    自己写一套 systemctl 脚本,或者用 systemd
    JokerLiang
        5
    JokerLiang  
       2020-12-01 10:15:19 +08:00
    上 docker
    yalin
        6
    yalin  
       2020-12-01 10:15:48 +08:00
    system V
    ike
        7
    cike  
       2020-12-01 10:17:37 +08:00
    systemd
    supervisor
    msg7086
        8
    msg7086  
       2020-12-01 10:18:13 +08:00 via Android
    用正确的方法呗(指用服务管理器)。
    GM
        9
    GM  
       2020-12-01 10:26:01 +08:00
    java service wrapper,a.k.a jsw 值得你拥有。
    dark3212
        10
    dark3212  
       2020-12-01 10:29:39 +08:00
    supervisor
    就算用 nohup 你也可以添加到开机启动命令里来达到重启自动启动的效果。
    40EaE5uJO3Xt1VVa
        11
    40EaE5uJO3Xt1VVa  
       2020-12-01 10:42:00 +08:00
    systemd 开机自启动
    开始我还以为要后台运行,用 nohup
    xiaoz
        12
    xiaoz  
       2020-12-01 10:48:08 +08:00 via Android
    systemd 吧,挺方便的。
    zifangsky
        13
    zifangsky  
       2020-12-01 10:50:37 +08:00
    这个帖子不错,很有参考价值,感谢各位的回答!
    FullBridgeRect
        14
    FullBridgeRect  
       2020-12-01 10:52:50 +08:00 via Android
    systemd supervisord 这些服务管理器都不错
    kiddingU
        15
    kiddingU  
       2020-12-01 10:52:58 +08:00
    systemd supervisor docker k8s 都行~~
    Cbdy
        16
    Cbdy  
       2020-12-01 11:03:30 +08:00
    systemd
    kingfalse
        17
    kingfalse  
       2020-12-01 11:13:47 +08:00 via Android   1
    搞个简单的 shell 脚本死循环,完美解决
    #!/bin/bash
    while [ 1 ]
    do
    java -jar xxx.jar
    done
    kingfalse
        18
    kingfalse  
       2020-12-01 11:14:12 +08:00 via Android
    一个敢死,一个敢埋,稳的一批
    itechify
        19
    itechify  
    PRO
       2020-12-01 11:28:15 +08:00
    @kingfalse #17 你的操作 666 !
    Weixiao0725
        20
    Weixiao0725  
       2020-12-01 11:44:44 +08:00
    java 这种已经屏蔽底层的语言还要外面再包个 docker,套娃吗?
    wtks1
        21
    wtks1  
       2020-12-01 11:47:31 +08:00 via Android
    最简单的,写个脚本监控,挂在定时任务里
    deplives
        22
    deplives  
       2020-12-01 11:49:13 +08:00
    supervisor
    cheng6563
        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
    ```
    FreeEx
        24
    FreeEx  
       2020-12-01 12:00:11 +08:00
    @cheng6563 少写了 systemctl daemon-reload
    xmge
        25
    xmge  
       2020-12-01 12:02:43 +08:00
    supervisor 这个很方便
    chaffy
        26
    chaffy  
       2020-12-01 12:04:02 +08:00
    crond 不就 OK 了吗,检测下进程
    noqwerty
        27
    noqwerty  
       2020-12-01 12:13:10 +08:00
    我们现在图省事就全放 docker 了,如果单纯管理进程的话 systemd, supervisor, pm2 任选一个都可以,稳定性都很不错,这三个里面个人认为 pm2 最方便
    Kirsk
        28
    Kirsk  
       2020-12-01 12:21:12 +08:00 via Android
    看起来都很麻烦 不用容器其他情况下 service 软链接 jar 包直接跑
    zengming00
        29
    zengming00  
       2020-12-01 12:31:39 +08:00
    pm2 start 可执行命令 -- 参数 // 参数前是两个连续的减号,这样参数才能传递进可执行命令
    pm2 save // 保存当前运行的列表,这样在系统重启时才能自动恢复
    julyclyde
        30
    julyclyde  
       2020-12-01 12:50:28 +08:00
    需要一个父进程监听 SIGCHLD 信号
    nohup 显然是错误的,并不是一种选择
    autogen
        31
    autogen  
       2020-12-01 12:55:44 +08:00
    jar 现在不都是放 docker 里跑吗
    qbhy
        32
    qbhy  
       2020-12-01 12:57:09 +08:00
    docker
    Selenium39
        33
    Selenium39  
       2020-12-01 13:00:15 +08:00
    @zengming00 这个除了 nodejs,java 也能用的吗?
    sagaxu
        34
    sagaxu  
       2020-12-01 13:03:11 +08:00 via Android   1
    我提供个简单方便的野路子

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

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

    容器勉勉强强也可以算作一类 supervisor,也支持一部分的资源管理和自动化嘛,比如说 docker 、podman 。而且也有多机方案,最典型的就是 k8s 、docker swarm 这类容器编排工具。
    gesse
        36
    gesse  
       2020-12-01 13:32:09 +08:00 via iPhone
    还有更简单点 pm2
    dorothyREN
        37
    dorothyREN  
       2020-12-01 13:32:32 +08:00
    supervisor,systemd, pm2,tomcat
    phoolean
        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 里每分钟执行一次
    fuis
        39
    fuis  
       2020-12-01 13:46:11 +08:00
    直接用 systemd 不就好了,整什么 pm2 supervisor 最后还不是依赖 systemd 。。
    anansi
        40
    anansi  
       2020-12-01 14:19:46 +08:00
    supervisor
    akira
        41
    akira  
       2020-12-01 14:21:12 +08:00
    别抢运维的活。。
    3t
        42
    3t  
       2020-12-01 14:34:19 +08:00
    最近上手了 pm2,改两行配置代码就行了,自带自动重启
    Illusionary
        43
    Illusionary  
       2020-12-01 14:47:18 +08:00
    2021 年了还不上 docker ?
    namelosw
        44
    namelosw  
       2020-12-01 16:04:51 +08:00
    怕吗? 怕就 Kubernetes.
    chenhbang
        45
    chenhbang  
       2020-12-01 17:26:31 +08:00
    systemd . supervisor . docker
    wongy
        46
    wongy  
       2020-12-01 17:29:19 +08:00 via iPhone
    https://github.com/mojohaus/appassembler
    Java Service Wrapper 是我目前使用的打包执行工具
    Fanx
        47
    Fanx  
       2020-12-01 18:32:29 +08:00
    写 systemd
    zengming00
        48
    zengming00  
       2020-12-01 20:42:08 +08:00
    @Selenium39 以前 pm2 是 nodejs 专用,现在 pm2 已经是通用的了
    dooonabe
        49
    dooonabe  
       2020-12-01 21:36:48 +08:00 via Android
    setsid
    sampeng
        50
    sampeng  
       2020-12-01 21:43:47 +08:00 via iPhone
    生产环境表示干了十年也没用 nohub 跑业务。临时几分钟脚本偶尔用
    yishenggudou
        51
    yishenggudou  
       2020-12-01 22:10:22 +08:00
    supervisor 正解
    IgniteWhite
        52
    IgniteWhite  
       2020-12-02 06:15:11 +08:00 via iPhone
    介于 nohup 和 service 之间还可以写个开机启动的 tmux 脚本
    FlexGap
        53
    FlexGap  
       2020-12-02 09:56:27 +08:00
    实在嫌烦就上 PM2
    goodboy95
        54
    goodboy95  
       2020-12-02 10:02:54 +08:00
    以前用 supervisor,后来公司开始大力推 docker (不过让我们连 nginx 都搭在 docker 上是我万万没有想到的,我过了一年都没想出这么干有什么好处)
    julyclyde
        55
    julyclyde  
       2020-12-02 11:26:51 +08:00
    @goodboy95 确实没什么好处。就是一种病
    julyclyde
        56
    julyclyde  
       2020-12-02 11:27:06 +08:00
    @IgniteWhite 这个显然不靠谱
    IgniteWhite
        57
    IgniteWhite  
       2020-12-03 03:42:09 +08:00 via iPhone
    @julyclyde 资源占用来说 tmux session 当然比系统 service 稍大,但是靠谱不靠谱得看脚本怎么写。不过脚本如果做成了 service 用 tmux 就没有意义了
    ql562482472
        58
    ql562482472  
       2023-07-10 20:07:38 +08:00
    @goodboy95 2 年半了 你明白有什么好处了吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     985 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:04 PVG 07:04 LAX 16:04 JFK 19:04
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86