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...