V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zealinux
V2EX  ›  程序员

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

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

    现在都是使用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
    cike
        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
    一个敢死,一个敢埋,稳的一批
    oneisall8955
        19
    oneisall8955  
       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   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.