wangxiaoaer
V2EX  ›  问与答

Java 进程管理

  •  
  •   wangxiaoaer · Jun 10, 2018 · 3642 views
    This topic created in 3070 days ago, the information mentioned may be changed or developed.

    服务器上的 java web 应用,通过 java -jar xx.jar 运行。

    怎么方便的管理这些进程?类似 pm2 管理 nodejs 的应用一样?

    试过 supervisor,感觉不舒服,还有么有类似的?

    Supplement 1  ·  Jun 10, 2018
    我说进程管理其实是指方便的查看状态、启动、停止、重启等。
    18 replies  •  2018-06-11 11:30:51 +08:00
    GuryYu
    GuryYu
    Jun 10, 2018 via iPhone
    1
    可以考虑用 docker,一个进程一个容器
    rockyou12
    rockyou12
    Jun 10, 2018
    2
    打包成 docker image 是最好,最方便的。
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 10, 2018
    3
    docker 不考虑。服务器就这一个应用,不需要容器化。
    hcymk2
    hcymk2
    Jun 10, 2018
    4
    pm2 可以管理脚本。
    Cbdy
    Cbdy
    Jun 10, 2018 via Android
    5
    po 的这个问题我也思考过,路径和你一样,也尝试过用 pm2、Supervisor、Docker。问题都比较明显。pm2 虽然可以,但是它始终还是为 Node.js 设计的。Supervisor 用需要 Python,直接不考虑。Docker 总的来说是比较好的方案,可以考虑采用外挂 volume 的“轻量”容器化方案,基本能达到和 pm2 类似的效果

    如果确实不考虑 Docker,可以试试我写的一个启停 Shell 脚本,应用状态可以用类似 JMX 的方案
    脚本:
    https://github.com/cbdyzj/boot/blob/master/bin/bootstrap
    hcymk2
    hcymk2
    Jun 10, 2018
    6
    @Cbdy
    Shell 改改其实就可以直接用 systemd.service 了。
    Cbdy
    Cbdy
    Jun 10, 2018 via Android
    7
    @hcymk2 对的,如果是稳定的服务,注册成 systemd 或者 SysV 服务当然最好了,如果需要经常发布,就显得不灵活了
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 10, 2018 via Android
    8
    @Cbdy 多谢,我试试这个脚本吧。
    wdlth
    wdlth
    Jun 10, 2018
    10
    可以做成服务,用系统自己的服务管理。
    mritd
    mritd
    Jun 11, 2018 via iPhone
    11
    说了这么多,你们就没人研究下现代系统自身的 systemd 么?
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 11, 2018
    12
    @mritd #11 太复杂,没有看下去的欲望。

    非系统级或者大型产品化的应用,我觉得没必要上这个。
    mritd
    mritd
    Jun 11, 2018
    13
    @wangxiaoaer #12 这玩意复杂?单独切割守护类的服务写一个配置文件就完事,不超过 20 行;上面 pm2、Supervisor、docker 那个玩意不比这个重
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 11, 2018
    14
    @mritd #13
    其他没用过,我说下 PM2 我是怎么用的:

    npm install pm2 -g
    cd ...../app
    pm2 start server.js --name n

    还有比这个还简单的?这也不算重吧。
    mritd
    mritd
    Jun 11, 2018
    15
    @wangxiaoaer #14

    centos7+、debian9+、ubuntu16+ 无需安装任何环境(nodejs/python),系统级托管服务

    cat > /lib/systemd/system/xxxx.service <<EOF
    [Unit]
    Description=xxxxxx
    After=network.target
    After=network-online.target
    Wants=network-online.target

    [Service]
    Type=simple
    ExecStart=/path/to/java -jar xxxx.jar
    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target
    EOF

    systemctl daemon-reload && systemctl start xxxx
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 11, 2018
    16
    @mritd #15 还不错 :) 我参考下。
    mritd
    mritd
    Jun 11, 2018❤️1
    17
    @wangxiaoaer #16
    看你需求就是需要启动停止啥的
    systemctl start xxxx
    systemctl stop xxxx
    systemctl restart xxxx
    systemctl status xxxx

    如果你的日志打到了 STDOUT,那么使用 journalctl -fu xxxx 观察日志(-f 持续监测)
    不过 java 一般都是 logback 啥的送到具体文件了吧

    安全性需求强你可以看下 systemd service 怎么使用特定用户运行
    wangxiaoaer
    wangxiaoaer
    OP
    Jun 11, 2018
    18
    @mritd #17 好的,多谢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4890 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    ♥ Do have faith in what you're doing.