shell中后台运行函数
在shell中定义好的函数,运行的时候可以直接在脚本里面通过func &方式后台运行。
一开始我很好奇为什么shell脚本里面定义好的函数可以这么用,通常我们在脚本中都是以后台方式运行其它的脚本或者命令。
于是做了如下一个实验:
new()
{
echo "func bkground pid by \$\$ is $$"
while [ 1 == 1 ]
do
sleep 5
done
}echo "current script pid is $$"
new &
while [ 1 == 1 ]
do
sleep 5
done
运行如上脚本后,通过ps查看会发现当前运行了两个shell进程,输出如下:
[root@localhost ~]# ps -ef|grep test
root26960 306780 12:05 pts/000:00:00 sh test.sh
root26961 269600 12:05 pts/000:00:00 sh test.sh
所以可以确认,shell里面是可以直接以后台方式运行函数的,后台运行的函数以一个新的进程运行。
可是这个时候看一下脚本的输出,会发函数虽然以后台方式在运行了,但是获取到的当前进程id却和主进程一样:
[root@localhost ..]# sh test.sh
current script pid is 26960
func bkground pid by $$ is 26960
分析原因,可能是因为新的进程继承了主进程的环境变量,直接把$$也copy过来了,所以在新的进程里面获取到的进程id是和父进程一样的。这个现象和fork()很类似,于是google了一下,网上有人问到shell里面是否有类似于c函数fork的实现,下面的回答就是用& 。
所以这个后台运行的函数进程,应该是直接copy的主进程的环境变量,导致在函数进程里面通过$$获取到的进程id是错的。
最后在分享一个小技巧,在shell里面如果以后台的方式运行一个代码片段,前提是不定义函数,实现方式是:
{ ....
....
} &
【shell中后台运行函数】
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理