java - 使用 go 管理 Java 进程

标签 java linux go jvm

我已经准备好 JVM 和我的 Java 程序的所有依赖项。使用 Java,我会像这样运行:

javac HelloWorld.java
java HelloWorld

现在我想在 Linux 环境下,使用 Go 的 cmd 包来控制这个 Java 程序进程。在 Go 中,当你运行命令时,你会得到 PID。有了这个 PID,我想随时终止 Java 程序并使用相同的 cmd 包重新启动。只要我安装了 JVM,它就能正常工作吗?我想做的:

cmd := exec.Command("bash", "-c", " "java HelloWorld")
cmd.Start()
syscall.Kill(cmd.Process.Pid)

谢谢!

最佳答案

简而言之,是的。

作为测试,添加了中断处理,这样您自己的 Go 进程就不会终止,这将起作用:

package  main

import (
    "os/exec"
    "syscall"
    "os"
    "os/signal"
    "fmt"
)

func main()  {

    cmd := exec.Command("bash", "-c", "java HelloWorld")
    err := cmd.Start()
    fmt.Printf("Starting java proccess with pid %d\n", cmd.Process.Pid)
    if err != nil {
        // do something about it
    }

    c := make(chan os.Signal, 1)
    done := make(chan bool, 1)
    signal.Notify(c, os.Interrupt)
    signal.Notify(c, syscall.SIGTERM)

    go func() {
        <-c
        fmt.Printf("Sending interrupt to pid: %d\n", cmd.Process.Pid)
        syscall.Kill(cmd.Process.Pid, syscall.SIGHUP)
        done <- true
    }()
    <-done

}

伴随 Java 类:

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        System.out.println("Hello World from Go! But you cant see me :)");
        while (true) {
            System.out.println("you cant see this because I am outing to the STDOUT of a subshell!");
            Thread.sleep(5000);
        }
    }
}

但它充满陷阱。只要您的 Go 进程正常退出,它就会向 java pid 发送您指定的信号(如果我敢猜测,sighup 将是自然选择)。但是你需要确保你不会让僵尸出现,以防你自己的 Go 进程崩溃,或者你的 Java 应用程序在你告诉它关闭后未能干净地挂起。将该 pid 保存到/tmp/文件并在重新启动的情况下用它做各种事情可能很有趣,但你知道你的需求。

编辑:从另一个程序控制 JVM 进程可能会很快变得挑剔。你应该评估你是否真的想这样做。如果您使用的是 Linux,如果您的配套 Java 程序充当守护进程,我会看一下您的发行版使用的 SysV init/systemd/upstart/start-stop-daemon 系统。

关于java - 使用 go 管理 Java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906190/

相关文章:

java - 如何使用JPA选择 native 表列?

java - 从数据库中提取数据到 Java 中的文本字段或文本区域

go - Golang客户端库对Apache Airflow的支持

regex - 无法在正则表达式中捕获单引号

json - 如何用 Go 结构体来表示这个复杂的数据结构?

java - for 循环 - 循环次数超出预期?

java - 使用 rJava 从 R 中使用 Jackcess

Linux命令选择特定目录

c - 在 C 程序中移动光标

php - 具有多字节字符编码支持的 HTML 到图像/pdf 转换器