shell中后台运行函数

在shell中定义好的函数,运行的时候可以直接在脚本里面通过func &方式后台运行。

一开始我很好奇为什么shell脚本里面定义好的函数可以这么用,通常我们在脚本中都是以后台方式运行其它的脚本或者命令。

于是做了如下一个实验:

[plain]  view plain  copy
  1. new()  
  2. {     
  3.      echo "func bkground pid by \$\$ is $$"  
  4.      while [ 1 == 1 ]  
  5.      do  
  6.            sleep 5  
  7.      done  
  8. }  
  9.   
  10. echo "current script pid is $$"  
  11. new &  
  12. while [ 1 == 1 ]  
  13. do  
  14.     sleep 5  
  15. done  

运行如上脚本后,通过ps查看会发现当前运行了两个shell进程,输出如下:

[plain]  view plain  copy
  1. [root@localhost ~]# ps -ef|grep test  
  2. root     26960 30678  0 12:05 pts/0    00:00:00 sh test.sh  
  3. root     26961 26960  0 12:05 pts/0    00:00:00 sh test.sh  
所以可以确认,shell里面是可以直接以后台方式运行函数的,后台运行的函数以一个新的进程运行。

可是这个时候看一下脚本的输出,会发函数虽然以后台方式在运行了,但是获取到的当前进程id却和主进程一样:

[plain]  view plain  copy
  1. [root@localhost ..]# sh test.sh   
  2. current script pid is 26960  
  3. func bkground pid by $$ is 26960  

分析原因,可能是因为新的进程继承了主进程的环境变量,直接把$$也copy过来了,所以在新的进程里面获取到的进程id是和父进程一样的。这个现象和fork()很类似,于是google了一下,网上有人问到shell里面是否有类似于c函数fork的实现,下面的回答就是用&。

所以这个后台运行的函数进程,应该是直接copy的主进程的环境变量,导致在函数进程里面通过$$获取到的进程id是错的。


最后在分享一个小技巧,在shell里面如果以后台的方式运行一个代码片段,前提是不定义函数,实现方式是:

{ ....

  ....

} &

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值