使用 go 管理 Java 进程

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


javac HelloWorld.java

java HelloWorld

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


cmd := exec.Command("bash", "-c", " "java HelloWorld")

cmd.Start()

syscall.Kill(cmd.Process.Pid)


汪汪一只猫
浏览 268回答 1
1回答

慕田峪9158850

简而言之,是的。作为测试,添加中断处理,因此您自己的 Go 进程不会终止,这将起作用:package&nbsp; mainimport (&nbsp; &nbsp; "os/exec"&nbsp; &nbsp; "syscall"&nbsp; &nbsp; "os"&nbsp; &nbsp; "os/signal"&nbsp; &nbsp; "fmt")func main()&nbsp; {&nbsp; &nbsp; cmd := exec.Command("bash", "-c", "java HelloWorld")&nbsp; &nbsp; err := cmd.Start()&nbsp; &nbsp; fmt.Printf("Starting java proccess with pid %d\n", cmd.Process.Pid)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; // do something about it&nbsp; &nbsp; }&nbsp; &nbsp; c := make(chan os.Signal, 1)&nbsp; &nbsp; done := make(chan bool, 1)&nbsp; &nbsp; signal.Notify(c, os.Interrupt)&nbsp; &nbsp; signal.Notify(c, syscall.SIGTERM)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; <-c&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Sending interrupt to pid: %d\n", cmd.Process.Pid)&nbsp; &nbsp; &nbsp; &nbsp; syscall.Kill(cmd.Process.Pid, syscall.SIGHUP)&nbsp; &nbsp; &nbsp; &nbsp; done <- true&nbsp; &nbsp; }()&nbsp; &nbsp; <-done}配套Java类:public class HelloWorld {&nbsp; &nbsp; public static void main(String[] args) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Hello World from Go! But you cant see me :)");&nbsp; &nbsp; &nbsp; &nbsp; while (true) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("you cant see this because I am outing to the STDOUT of a subshell!");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(5000);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}但它充满了陷阱。只要您的 Go 进程正常退出,它就会将您指定的信号(如果我敢猜测的话,sighup 是自然的选择)发送到 java pid。但是你需要确保你不会让僵尸在你自己的 Go 进程崩溃或者你的 Java 应用程序在你告诉它时没有干净地关闭后挂起的情况下。将该 pid 保存到 /tmp/ 文件并在重新启动的情况下用它做各种事情可能很有趣,但您知道自己的需求。编辑:从另一个程序控制 JVM 进程可能会很快变得挑剔。你应该评估你是否真的想这样做。如果您使用的是 Linux,如果您的配套 java 程序充当守护程序,我会查看您的发行版使用的 SysV init/systemd/upstart/start-stop-daemon 系统。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go