英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论