【问题标题】:Bash forking a subshellBash 分叉一个子shell
【发布时间】:2016-12-23 03:43:33
【问题描述】:

我有一个 bash 脚本,我想在分叉的进程中运行一些不相关的命令。这些命令应该只在派生进程中运行,而其他命令应该只在父进程中运行。

echo "I am parent statement 1"
( echo "I am child statement 1"; echo "I am child statement 2"; sleep 30) &
echo "I am parent statement 2"

在这个例子中,父shell是否只输出'parent'语句,而子shell只回显'child statements'?或者孩子会在返回时回显父语句2?

同样,父母会等待孩子(睡 30 分钟)吗?还是父母退出,孩子继续跑30秒?

【问题讨论】:

  • 你为什么不运行它看看?您可以轻松地将 pid 添加到每个 echo 中,以查看哪个进程正在发出它。
  • 我试过了——但从输出中并不清楚哪个 shell 正在输出什么。而且我不确定如何将一些输出发送到一个窗口,一些输出到另一个窗口
  • echo "$$: I am parent statement 2" 前面会加上 pid,这将帮助您轻松识别它的来源。
  • 好的 - 会尝试的。我也无法判断父 shell 是否还活着等待子 shell 完成。但是控制权被返回(我看到了 bash 提示符)。不知道如何解释
  • 睡后在孩子身上打印。您将看到它在父级退出后的一段时间内打印出来(返回到提示符)。那应该会给你答案。

标签: linux bash shell fork


【解决方案1】:

每个进程只会运行自己的语句。

如果你稍微修改你的脚本,你可以做一个实验,表明孩子比父母长寿。

#!/bin/bash

echo "I am parent statement 1"
( echo "I am child statement 1"; echo "I am child statement 2"; sleep 30) &
jobs -l
echo "I am parent statement 2"
echo $$

如果您运行脚本,然后为父母和孩子都执行ps aux | grep <pid>,您会看到父母已经死了,而孩子还活着。

【讨论】:

  • 这不适用于您显示的代码,但请注意子shell(bash 中的子进程)中的$$伪造的。您可以使用(echo $$;ps) 看到效果,有或没有尾随&
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2012-04-24
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多