gpt4 book ai didi

java - 使用 go 管理 Java 进程

转载 作者:IT王子 更新时间:2023-10-29 02:23:24 27 4
gpt4 key购买 nike

我已经准备好 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com