![如何在 bash 中启动虚拟进程,该进程将启动另外七个后代进程](https://linux22.com/image/202516/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E4%B8%AD%E5%90%AF%E5%8A%A8%E8%99%9A%E6%8B%9F%E8%BF%9B%E7%A8%8B%EF%BC%8C%E8%AF%A5%E8%BF%9B%E7%A8%8B%E5%B0%86%E5%90%AF%E5%8A%A8%E5%8F%A6%E5%A4%96%E4%B8%83%E4%B8%AA%E5%90%8E%E4%BB%A3%E8%BF%9B%E7%A8%8B.png)
我正在尝试编写一个 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 &
开始两代人,每代人有三个孩子。