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

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

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

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

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

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