【问题标题】:Finding number of child processes查找子进程的数量
【发布时间】:2012-07-17 12:57:27
【问题描述】:

如何从脚本本身中找到 bash 脚本的子进程数?

【问题讨论】:

    标签: bash process pid


    【解决方案1】:

    要获取 bash 脚本的 PID,您可以使用变量 $$

    然后,要获得它的孩子,你可以运行:

    bash_pid=$$
    children=`ps -eo ppid | grep -w $bash_pid`
    

    ps 将返回父 PID 列表。然后grep 过滤所有与 bash 脚本的子进程无关的进程。为了得到孩子的数量,你可以这样做:

    num_children=`echo $children | wc -w`
    

    实际上,您将获得的数字将减 1,因为 ps 也将是 bash 脚本的子代。如果您不想将 ps 的执行算作孩子,那么您可以通过以下方式解决:

    let num_children=num_children-1
    

    更新:为了避免调用grep,可能会使用以下语法(如果已安装的ps版本支持):

    num_children=`ps --no-headers -o pid --ppid=$$ | wc -w`
    

    【讨论】:

    • grep -w $bash_pid 如果 bash pid 是子进程 ID 的子字符串。
    • 不确定,但我认为额外的进程是包含 ps/grep 管道的子shell。只是迂腐:)
    • 不需要grepps -o ppid= -p $$(至少对于GNU ps)。
    • @chepner 我也不确定,所以我只是快速检查了一下。我创建了一个包含foo=$(sleep 10 | wc -l) 的小脚本。然后我检查了pssleepwc 都被列为脚本的直接子级(即,两者之间没有新的 shell)。
    • 哦,抱歉,我暂时忘记了 OP 正在寻找孩子,我忽略了您逐步回答的进度。
    【解决方案2】:

    使用 ps--ppid 选项来选择当前 bash 进程的子进程。

    bash_pid=$$
    child_count=$(ps -o pid= --ppid $bash_id | wc -l)
    let child_count-=1    # If you don't want to count the subshell that computed the answer
    

    (注意:对于--ppid,这需要ps 的Linux 版本。我不知道是否有BSD ps 的等效版本。)

    【讨论】:

    • 对我不起作用。给我一个ps: illegal option -- -。也许您假设的是特定版本的 ps?
    • 是的,我假设的是 Linux 使用的版本。
    • 啊。我在 FreeBSD 和 OSX 上测试过。
    【解决方案3】:

    您可以评估 shell 内置命令作业,例如:

    counter = `jobs | wc -l`
    

    【讨论】:

    • 计算的是作业,而不是进程。一个作业可以包含多个进程。
    • 等号周围没有空格。使用$() 而不是反引号。
    【解决方案4】:

    你也可以使用 pgrep:

    child_count=$(($(pgrep --parent $$ | wc -l) - 1))

    使用pgrep --parent $$ 获取 bash 进程的子进程列表。
    然后在输出上使用wc -l 得到行数:$(pgrep --parent $$ | wc -l) 然后减 1(即使pgrep --parent $$ 为空,wc -l 也会报告 1)

    【讨论】:

      【解决方案5】:

      我更喜欢:

      num_children=$(pgrep -c -P$$)

      它只产生一个进程,您不必计算字数或通过管道中的程序调整 PID 的数量。

      例子:

      ~ $ echo $(pgrep -c -P$$)
      0
      ~ $ sleep 20 &
      [1] 26114
      ~ $ echo $(pgrep -c -P$$)
      1
      

      【讨论】:

        【解决方案6】:

        如果作业计数(而不是 pid 计数)足够,我只提供了一个 bash-only 版本:

        job_list=($(jobs -p))
        job_count=${#job_list[@]}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 2011-04-22
          • 1970-01-01
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多