gpt4 book ai didi

go - 为什么子进程 "sleep 10"不会终止?

转载 作者:行者123 更新时间:2023-12-01 22:38:08 26 4
gpt4 key购买 nike

我需要测试一个进程是否终止,而我所拥有的只是它的 pid 号。为此,我测试伪文件“/proc/ ”是否存在。

为这个函数写一个测试,我注意到进程没有按预期终止。

对于测试,我运行“sleep 10”作为应该运行 10 秒的子进程。启动此过程后,我轮询伪文件“/proc/ ”的消失。该伪文件永远不会消失,也不会检测到子进程的终止。

测试golang playground的代码重现问题: https://play.golang.org/p/fb4CbXkIjh3 .

我检查了该进程是否已创建,并且 pid 是否正确。在检查过程中可以看到它变成了 。它没有因此被删除。

问题如下:

  • 为什么子进程不终止?
  • 如何更改代码以使其终止?
  • package main

    import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "strconv"
    "time"
    )

    func main() {
    fmt.Println("Hello, playground")

    cmd := exec.Command("sleep", "10")
    if err := cmd.Start(); err != nil {
    log.Fatal("unexpected error:", err)
    }
    pidStr := strconv.Itoa(cmd.Process.Pid)
    log.Println("sleep pid:", pidStr)

    for {
    if _, err := os.Stat("/proc/" + pidStr); os.IsNotExist(err) {
    log.Println("detect termination of /proc/" + pidStr)
    return
    }
    log.Println("pgm /proc/" + pidStr + " is running")
    time.Sleep(3 * time.Second)
    }
    }

    最佳答案

    在操作系统级别,在任何与 POSIX 兼容的操作系统(Unix、Linux、Darwin 等)中,已完成但尚未被其上级收集的进程处于“已失效”或“僵尸”状态。它仍然存在,但不能被杀死:它已经死了。它的存在正是为了它的上级——可以调用操作系统级别的进程wait系统调用——可以调用操作系统级别wait系统调用并看到该进程现在已经死了。

    一旦它的上级等待它,该进程就真正被删除了:不再有一个僵尸进程占用该进程 ID。如果您有 /proc文件系统,这是进程从 /proc 消失的时候.

    在 Go 中,调用 cmd.Wait()调用操作系统级别 wait打电话,所以这就是这样做的方法。如果你想收集这个 cmd.Wait() 的结果,一个很好的方法是通过一个 channel 发送它。

    (如果你想生成一个运行时间很长的进程而不是等待它,你可以放弃它,这样你就不再是它的上级了。正确执行此操作的细节充满了操作系统特定的小玩意,例如丢弃控制 tty ,设置 session ,使用 procctlprctl 等等。)

    关于go - 为什么子进程 "sleep 10"不会终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085917/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com