如何从 shell 脚本中的分叉子进程获取 PID

新手上路,请多包涵

我相信我可以从父进程中派生 10 个子进程。

下面是我的代码:

 #/bin/sh
fpfunction(){
    n=1
    while (($n<20))
    do
        echo "Hello World-- $n times"
        sleep 2
        echo "Hello World2-- $n times"
        n=$(( n+1 ))
    done
}

fork(){
    count=0
    while (($count<=10))
    do
        fpfunction &
        count=$(( count+1 ))
    done
}

fork

但是,如何从我刚刚创建的每个子进程中获取 pid?

原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

后台子进程的 PID 存储在 $! 中,当前进程为 $$

 fpfunction &
child_pid=$!     # in parent process, child's pid is $!
parent_pid=$$    # in parent process, parent's pid is $$

在后台函数中,子进程的 PID 是 $BASHPID 而不是 $$ 现在是父进程的 PID:

 fpfunction() {
    local child_pid=$BASHPID   # in child process, child's pid is $BASHPID
    local parent_pid=$$        # in child process, parent's pid is $$
    ...
}


同样值得一提的是,您可以将循环语句组合成一个类似 C 的 for 循环:

 for ((n = 1; n < 20; ++n)); do
    echo "Hello World-- $n times"
    sleep 2
    echo "Hello World2-- $n times"
done

原文由 John Kugelman 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 Bash 手册

!

扩展为最近执行的后台(异步)命令的进程 ID。

即,使用 $!

原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题