shell脚本在处理、调度任务时会大量使用同步、异步处理机制

同步处理

父进程:

#!/bin/bash

# sync-parent.sh
# 同步执行 - 父进程
#

echo "父进程启动..."

echo "父进程:调用子进程..."
./sync-child.sh &

#通过shell参数 $! 接收子进程pid
pid=$!   #赋值时不要写成 pid = $!

./sync-child2.sh &
pid2=$!

sleep 2
echo "父进程:继续运行..."

echo "父进程:父进程运行结束,over..."
sleep 5

 子进程:

#!/bin/bash

# sync-child.sh
# 同步执行 - 子进程
#

#通过shell参数 $$ 获取自身的pid
pid=$$

echo "子进程(PID=${pid}):子进程启动..."

echo "子进程(PID=${pid}):处理任务中..."
sleep 5

echo "子进程(PID=${pid}):子进程运行结束..."

 子进程2:

#!/bin/bash

# sync-child2.sh
# 同步执行 - 子进程2
#

#通过shell参数 $$ 获取自身的pid
pid=$$

echo "子进程(PID=${pid}):子进程2启动..."

echo "子进程(PID=${pid}):处理任务中..."
sleep 1

echo "子进程(PID=${pid}):子进程2运行结束..."

 运行结果:

➜  shell git:(master) ✗ ./sync-parent.sh
父进程启动...
父进程:调用子进程...
子进程(PID=1913):子进程启动...
子进程(PID=1913):处理任务中...
子进程(PID=1914):子进程启动...
子进程(PID=1914):处理任务中...
子进程(PID=1914):子进程运行结束...
父进程:继续运行...
父进程:父进程运行结束,over...
子进程(PID=1913):子进程运行结束...

 

异步处理

父进程:

#!/bin/bash

# async-parent.sh
# 异步执行(wait) - 父进程
#

echo "父进程启动..."

echo "父进程:调用子进程..."
./async-child.sh &

#通过shell参数 $! 接收子进程pid
pid=$!   #赋值时不要写成 pid = $!

./async-child.sh &
pid2=$!

echo "父进程:子进程(PID=${pid})已经启动..."
echo "父进程:子进程(PID=${pid2})已经启动..."

sleep 2
echo "父进程:继续运行..."

echo "父进程:暂停运行,等待子进程运行结束..."
wait ${pid}
wait ${pid2}

echo "父进程:父进程运行结束,over..."

 子进程:

#!/bin/bash

# async-child.sh
# 异步执行(wait) - 子进程
#

#通过shell参数 $$ 获取自身的pid
pid=$$

echo "子进程(PID=${pid}):子进程启动..."

echo "子进程(PID=${pid}):处理任务中..."
sleep 5

echo "子进程(PID=${pid}):子进程运行结束..."

 运行结果:

➜  shell git:(master) ✗ ./async-parent.sh
父进程启动...
父进程:调用子进程...
父进程:子进程(PID=2015)已经启动...
父进程:子进程(PID=2016)已经启动...
子进程(PID=2016):子进程启动...
子进程(PID=2015):子进程启动...
子进程(PID=2016):处理任务中...
子进程(PID=2015):处理任务中...
父进程:继续运行...
父进程:暂停运行,等待子进程运行结束...
子进程(PID=2015):子进程运行结束...
子进程(PID=2016):子进程运行结束...
父进程:父进程运行结束,over...