去吧,不能在无限循环内放弃进程

时间:2019-12-18 05:09:12

标签: macos go fork exec

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,但没有解决问题。

我需要这种行为,因为我试图轮询进程是否存在,如果死了则需要重新启动。它遵循一些更多细节。

  1. 该过程最初仍在运行,而我的程序并未启动。
  2. 程序启动子级后,它通常会继续运行。
  3. 父母去世后,孩子应该继续奔跑。
  4. 这在 * nix Windows 系统上都应相同。

这是我用来检查正在运行的进程的库: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

对于这种行为的任何帮助和澄清,我们将不胜感激!

0 个答案:

没有答案