• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zealinux
V2EX  ›  程序员

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

  •  
  •   zealinux · Dec 1, 2020 · 8044 views
    This topic created in 1996 days ago, the information mentioned may be changed or developed.

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

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

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

    有没有合适的方法?

    ubuntu 18.04 Java 1.8

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

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

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

    容器勉勉强强也可以算作一类 supervisor,也支持一部分的资源管理和自动化嘛,比如说 docker 、podman 。而且也有多机方案,最典型的就是 k8s 、docker swarm 这类容器编排工具。
    gesse
        36
    gesse  
       Dec 1, 2020 via iPhone
    还有更简单点 pm2
    dorothyREN
        37
    dorothyREN  
       Dec 1, 2020
    supervisor,systemd, pm2,tomcat
    phoolean
        38
    phoolean  
       Dec 1, 2020
    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  
       Dec 1, 2020
    直接用 systemd 不就好了,整什么 pm2 supervisor 最后还不是依赖 systemd 。。
    anansi
        40
    anansi  
       Dec 1, 2020
    supervisor
    akira
        41
    akira  
       Dec 1, 2020
    别抢运维的活。。
    3t
        42
    3t  
       Dec 1, 2020
    最近上手了 pm2,改两行配置代码就行了,自带自动重启
    Illusionary
        43
    Illusionary  
       Dec 1, 2020
    2021 年了还不上 docker ?
    namelosw
        44
    namelosw  
       Dec 1, 2020
    怕吗? 怕就 Kubernetes.
    chenhbang
        45
    chenhbang  
       Dec 1, 2020
    systemd . supervisor . docker
    wongy
        46
    wongy  
       Dec 1, 2020 via iPhone
    https://github.com/mojohaus/appassembler
    Java Service Wrapper 是我目前使用的打包执行工具
    Fanx
        47
    Fanx  
       Dec 1, 2020
    写 systemd
    zengming00
        48
    zengming00  
       Dec 1, 2020
    @Selenium39 以前 pm2 是 nodejs 专用,现在 pm2 已经是通用的了
    dooonabe
        49
    dooonabe  
       Dec 1, 2020 via Android
    setsid
    sampeng
        50
    sampeng  
       Dec 1, 2020 via iPhone
    生产环境表示干了十年也没用 nohub 跑业务。临时几分钟脚本偶尔用
    yishenggudou
        51
    yishenggudou  
       Dec 1, 2020
    supervisor 正解
    FurN1
        52
    FurN1  
       Dec 2, 2020 via iPhone
    介于 nohup 和 service 之间还可以写个开机启动的 tmux 脚本
    FlexGap
        53
    FlexGap  
       Dec 2, 2020
    实在嫌烦就上 PM2
    goodboy95
        54
    goodboy95  
       Dec 2, 2020
    以前用 supervisor,后来公司开始大力推 docker (不过让我们连 nginx 都搭在 docker 上是我万万没有想到的,我过了一年都没想出这么干有什么好处)
    julyclyde
        55
    julyclyde  
       Dec 2, 2020
    @goodboy95 确实没什么好处。就是一种病
    julyclyde
        56
    julyclyde  
       Dec 2, 2020
    @IgniteWhite 这个显然不靠谱
    FurN1
        57
    FurN1  
       Dec 3, 2020 via iPhone
    @julyclyde 资源占用来说 tmux session 当然比系统 service 稍大,但是靠谱不靠谱得看脚本怎么写。不过脚本如果做成了 service 用 tmux 就没有意义了
    ql562482472
        58
    ql562482472  
       Jul 10, 2023
    @goodboy95 2 年半了 你明白有什么好处了吗
    goodboy95
        59
    goodboy95  
       Nov 20, 2025 via Android
    @ql562482472 生产环境的话仍然不明白,不过开发环境倒是能轻松一点,各个项目自己写个 docker-compose ,一键启用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1510 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 121ms · UTC 16:54 · PVG 00:54 · LAX 09:54 · JFK 12:54
    ♥ Do have faith in what you're doing.