正文

shell 创建子进程及并行延时执行命令方法(shell制作一个进度条)满满干货

在这里插入图片描述

文章摘要

这篇文章介绍了在shell中创建子进程的几种方法,重点围绕使用括号命令列表、后台作业、管道以及执行外部脚本或程序等技术。文章指出,子进程的创建是通过“fork+exec”系统调用实现的,所有进程的创建均可视为子进程创建过程。此外,文章提到通过`BASH_SUBSHELL`变量可以检查子进程数量。通过示例代码展示了如何使用括号命令列表启动子进程,并强调了其灵活性和实用性。这种方法非常适合在不影响源程序执行的情况下,实现并行延时操作。


目录shell 创建子进程方法1. 什么是shell子进程2. shell什么情况下会产生子进程3.使用括号来创建子进程

子进程,是从父子进程的概念出发的,unix操作系统的进程从init进程开始(init进程为1,而进程号0为系统原始进程,以下讨论的进程原则上不包括进程0)均有其对应的子进程,就算是由于父进程先行结束导致的孤儿进程,也会被init领养,使其父进程ID为1。

也因为所有的进程均有父进程,事实上,所有进程的创建,都可视为子进程创建过程。在apue一书里提及unix操作系统进程的创建,大抵上的模式都是进行fork+exec类系统调用。

理解子进程的创建执行,需要至少细分到二个步骤,包括

1) 通过fork创建子进程环境,

2) 通过exec加载并执行进程代码。

而shell子进程(以下均称subshell),顾名思义,就是由“当前shell进程”创建的一个子进程

2.1 提交后台作业 &

command &

2.2 管道 |

command1 | command2

2.3 括号命令列表 ()

(cmd1;cmd2;cmd3)

2.4 执行外部脚本、程序

bash https://www.jb51.net/article/test.sh

说明:大致上子进程的创建包括以上四种情况了。需要说明的是只要是符合上边四种情况之一,便会创建(fork)子进程,不因是否是函数,命令,或程序,也不会因为是内置函数(buitin)或是外部程序。

shell中有一个变量 BASH_SUBSHELL 可以查看子 shell 的信息,该变量的初始值为0,每启动一个子 shell 该变量就会自动加1。

由下面的案例可以看到bash_subshell在子进程中的值是1,可以确定()开启了子进程。
[root@imx6sabresd ~]# cat test.sh #!/bin/bash # 功能描述:子Shell演示示例 # 父Shell #set -x hi=”parent shell” echo “+++++++++++++” echo -e “\033[31m+ 父Shell +\033[0m” echo “+++++++++++++” echo “PWD=$PWD” echo “PID=$$” echo “bash_subshell=$BASH_SUBSHELL” # 通过()开启子Shell ( sub_hi=”subshell” echo -e “\t+++++++++++++” echo -e “\t\033[33m+ 子Shell +\033[0m” echo -e “\t+++++++++++++” echo -e “\tPWD=$PWD” echo -e “\tPID=$$” echo -e “\tbash_subshell=$BASH_SUBSHELL” echo -e “\thi=$hi” echo -e “\tsubhi=$sub_hi” cd /opt;echo -e “\tPWD=$PWD” ) # 返回父Shell echo “+++++++++++++++++” echo “+ 返回父Shell +” echo “+++++++++++++++++” echo “PWD=$PWD” echo “hi=$hi” echo “sub_hi=$sub_hi” echo “bash_subshell=$BASH_SUBSHELL”

结果如下:子进程方法

在这里插入图片描述

例子:

如果在脚本中加入一个延时执行程序,并发执行,不想要影响源程序执行,可以引入括号
echo “start” (sleep 5 echo “hello world”) & echo “1” sleep 1 echo “2” sleep 1 echo “3” sleep 1 echo “4” sleep 0.5 echo “4.5”

结果如下:

在这里插入图片描述

参考链接:https://zhuanlan.zhihu.com/p/543308214

到此这篇关于shell 创建子进程及并行延时执行命令方法的文章就介绍到这了,更多相关shell 创建子进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Bat脚本-timeout 命令(延时执行)盘点Java中延时任务的多种实现方式Redisson 分布式延时队列 RedissonDelayedQueue 运行流程生产redisson延时队列不消费问题排查解决开发中避免延时操作技巧详解