【发布时间】:2026-02-11 09:05:02
【问题描述】:
我正在尝试使用 Go 的 os/exec Command() 来模拟按键,有时我想在 快速继任。我正在使用exec.Command 调用"xte",“key XF86AudioPlay”,它可以在 Linux 操作系统上暂停音乐。虽然Command 可以Start() 或 Run() 没问题,但如果我再次尝试执行,我得到一个错误:
exec: already started
我尝试在执行后立即使用Process.Kill(),以释放它,但这会使执行首先无法工作。我从这里得到了这个想法:Terminating a Process Started with os/exec in Golang
我的代码使用switch 并相应地调用此暂停函数,但我将简单分享我编写的代码的基础,以case 作为示例函数:
cmd := exec.Command("xte", "key XF86AudioPlay")
//...
func Pause() {
err := cmd.Start() // or cmd.Run()
if err != nil {
fmt.Println(err)
}
err = cmd.Process.Kill()
if err != nil {
fmt.Printf("Failed to kill: %s", err)
}
}
所以,回顾一下,我成功调用了一次,但在成功调用 Pause() 后,我收到来自 cmd.Start()/Run() 的错误,内容为:exec: already started。
我也尝试过lower,即使用syscall,但遇到了一些麻烦。我试过了:
args[0] = "xte"
args[1] = "key"
args[2] = "XF86AudioPlay"
//... Pause():
err := syscall.Exec("/bin", args, os.Environ())
if err != nil {
fmt.Println(err)
}
这里我遇到了permission denied 错误,即使以超级用户 (sudo) 身份运行也是如此。
我应该如何继续调用此Command(),然后将其释放以立即召回?还是我与syscall 走在正确的轨道上?
编辑
因此,作为 Amd 和 Son Bui 州的解决方案是创建 Command 每次我打算调用它时,基本上将分配 cmd := exec.Command()inside 我的 @987654344 @方法。
【问题讨论】:
标签: go exec system-calls