使用Go语言确定进程/程序是否已终止

huangapple go评论82阅读模式
英文:

Using Go to determine if a process/program has been terminated

问题

我正在使用Go制作一个小型桌面Web应用程序。该应用程序将作为本地Web服务器运行,并且会生成一个Chrome窗口以'app'模式运行。在此期间,Go程序将继续运行Web服务器。

我需要监视用户关闭此Chrome窗口的时刻,以便Web服务器也可以关闭。

我在下面的注释中标明了我需要帮助的地方。

package main

import (
	"fmt"
	"os/exec"
)

func main(){
	// 设置应用程序和参数。
    cmd := "chrome"
    // URL将是本地Web服务器。
    args := []string{"--user-data-dir=c:\\","--window-size=800,600","--app=http://www.google.com"}
    
    // 在此处启动本地Web服务器。
    // ...
    
    // 准备以应用程序模式启动Chrome。
    cmdExec := exec.Command(cmd, args...);
    
    // 异步启动Chrome。
    cmdExec.Start()
    
    // 在命令行上向用户显示应用程序正在运行。
    fmt.Println("Application in progress! Please close webapp to close webserver!")
    
    // 保持Web服务器运行,执行Web应用程序操作...
    
    // 监视我们之前启动的进程。如果用户关闭了那个Chrome窗口
    // 然后通知用户Web服务器现在正在关闭。
    
    // 这就是我需要帮助的地方!
    watchForProcessThatWeStartedEarlierForClosure...()//????
    
    // 完成!
    fmt.Println("Application exit!")
}

请帮我找到监视我们之前启动的进程以进行关闭的方法。

英文:

I am making a small desktop web application with Go. This application will run as a local web server and a Chrome window will be generated in 'app' mode. The Go program will continue to run the web server during this time.

I need to watch for the moment the user kills this Chrome window, so that the web server can close down too.

I've made a comment below showing where I need assistance.

package main

import (
	"fmt"
	"os/exec"
)

func main(){
	// Setup the application and arguments.
    cmd := "chrome"
	// URL will be local webserver.
	args := []string{"--user-data-dir=c:\\","--window-size=800,600","--app=http://www.google.com"}
	
	// Start local webserver here.
	// ...
	
	// Prepare Chrome in app mode.
	cmdExec := exec.Command(cmd, args...);
	
	// Start Chrome asynchronously.
	cmdExec.Start()
	
	// Show to the user on the command line that the application is running.
	fmt.Println("Application in progress! Please close webapp to close webserver!")
	
	// Keep the webserver running, do web app things...
	
	// Watch for that process we started earlier. If the user closes that Chrome window
	// Then alert the user that the webserver is now closing down.
	
	// This is where I need help!
    watchForProcessThatWeStartedEarlierForClosure...()//????    	

	// And we are done!
	fmt.Println("Application exit!")
}

答案1

得分: 2

你可以使用Wait()函数在cmdExec上等待子进程退出。

package main

import (
    "fmt"
    "os/exec"
)

func main(){
    // 设置应用程序和参数。
    cmd := "chrome"
    // URL将是本地web服务器。
    args := []string{"--user-data-dir=c:\\","--window-size=800,600","--app=http://www.google.com"}

    // 在这里启动本地web服务器。
    // ...

    // 准备以应用程序模式启动Chrome。
    cmdExec := exec.Command(cmd, args...);

    // 异步启动Chrome。
    cmdExec.Start()

    // 在命令行上向用户显示应用程序正在运行。
    fmt.Println("Application in progress! Please close webapp to close webserver!")

    // 保持web服务器运行,进行web应用程序操作...

    // 监视我们之前启动的进程。如果用户关闭了Chrome窗口
    // 然后通知用户web服务器现在正在关闭。

    // 可能应该在这里处理错误
    _ = cmdExec.Wait()      

    // 完成!
    fmt.Println("Application exit!")
}

我在本地使用Chromium进行了测试。关闭浏览器窗口后,需要几秒钟才能退出Chromium进程,然后Wait()函数返回。

英文:

You can use the Wait() function on cmdExec to wait for the child process to exit.

package main

import (
    "fmt"
    "os/exec"
)

func main(){
    // Setup the application and arguments.
    cmd := "chrome"
    // URL will be local webserver.
    args := []string{"--user-data-dir=c:\\","--window-size=800,600","--app=http://www.google.com"}

    // Start local webserver here.
    // ...

    // Prepare Chrome in app mode.
    cmdExec := exec.Command(cmd, args...);

    // Start Chrome asynchronously.
    cmdExec.Start()

    // Show to the user on the command line that the application is running.
    fmt.Println("Application in progress! Please close webapp to close webserver!")

    // Keep the webserver running, do web app things...

    // Watch for that process we started earlier. If the user closes that Chrome window
    // Then alert the user that the webserver is now closing down.

    // Should probably handle the error here
    _ = cmdExec.Wait()      

    // And we are done!
    fmt.Println("Application exit!")
}

Tested it locally with Chromium. After closing the browser window, it takes a few seconds before the Chromium process exists and then Wait() returns.

huangapple
  • 本文由 发表于 2016年4月2日 16:36:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/36371073.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定