如何在 bash 中启动虚拟进程,该进程将启动另外七个后代进程

如何在 bash 中启动虚拟进程,该进程将启动另外七个后代进程

我正在尝试编写一个 bash 脚本,它将以下面的格式记录所有后代进程信息,但只有当一个进程有超过六个后代进程时,我才必须记录信息。

PID PPID 等级
10 9 1(表示孩子)
9 8 2(表示父级)
8 7 3(表示祖父母)
Pstree -ps 10 should display:
dummy1---dummy2---dummy3---dummy4---dummy5---dummy6---dummy7

如何以上述方式触发虚拟进程?

坦率地说,我对 bash 脚本一无所知,我唯一能做的就是显示特定用户的 PID。

while read -r processId;
do
    echo $processId
done <<< "$(ps -u $USER -o pid)"

我需要循环每个 PID 并检查它是否有超过 6 个后代,但在此之前我想手动触发 6 个后代进程来启动和测试我的脚本。

答案1

要启动具有七个后代的脚本,您可以使用如下内容:

#!/bin/bash

if [[ "$#" -ne 1 ]]; then
    set -- 7
fi

if [[ "$1" -gt 2 ]]; then
    "$0" "$(($1 - 1))"
else
    sleep 120
fi

或者更紧凑地,

#!/bin/bash

[[ "$#" -ne 1 ]] && set -- 7

[[ $1 -gt 2 ]] && $0 $(($1 - 1)) || sleep 120

如果没有给定参数或给出太多参数,它将其参数设置为 7。然后,只要其参数大于 2,它就会启动一个子进程运行相同的脚本,并使用递减的参数。当参数达到 2 时,它会运行两分钟的睡眠。 (限制为两个,因为最后一个脚本和sleep也各算一个。)

$ ./dummy &
$ pstree -p 1800554
dummy(1800554)───dummy(1800561)───dummy(1800563)───dummy(1800566)───dummy(1800567)───dummy(1800570)───sleep(1800572)

您可以通过更改参数来请求不同数量的子级:

$ ./dummy 6 &

这可以扩展到在每个“一代”中启动多个孩子:

#!/bin/bash

[[ "$#" -ne 2 ]] && set -- 1 7

for (( i = 0; i < $1; i++ )); do
[[ $2 -gt 2 ]] && $0 $1 $(($2 - 1)) || sleep 120 &
done
wait

运行它作为

./dummy 3 2 &

开始两代人,每代人有三个孩子。

相关内容