在this question中,说明了如何使用Command
中的os/exec
方法来运行和放弃该过程。文档确认:
启动启动指定的命令,但不等待它执行 完成。
运行此基本程序并检查进程 PPID (父进程ID ),我们可以看到一切正常。 PPID 设置为1(在我的情况下为launchd
)。
package main
import "os/exec"
func main() {
cmd := exec.Command("sleep", "10")
cmd.Start()
}
但是,如果在Command
循环内调用for{}
,则程序将拥有sleep
进程。
package main
import "os/exec"
func main() {
var spawned bool
for {
if !spawned {
cmd := exec.Command("sleep", "10")
cmd.Start()
spawned = true
}
}
}
有办法避免吗?我试图在 goroutine 中调用Command
,但没有解决问题。
我需要这种行为,因为我试图轮询进程是否存在,如果死了则需要重新启动。它遵循一些更多细节。
这是我用来检查正在运行的进程的库:gopsutil。
关于我的系统:
$ go version
go version go1.13.4 darwin/amd64
$ system_profiler SPSoftwareDataType
Software:
System Software Overview:
System Version: macOS 10.15.1 (19B88)
Kernel Version: Darwin 19.0.0
Boot Volume: Macintosh HD
Boot Mode: Normal
User Name: Giacomo Stelluti Scala (giacomo)
Secure Virtual Memory: Enabled
System Integrity Protection: Enabled
Time since boot: 23 days 8:37
对于这种行为的任何帮助和澄清,我们将不胜感激!