linux脚本任务优先级,Shell脚本中与的优先级
命令介绍
& 放在启动参数后⾯表⽰设置此进程为后台进程
command &
&& ⽤于控制命令的执⾏顺序,⼀般形式为:
command1 && command2
命令的详细介绍⽹上有很多⽂档,在此就不详细列举了。
但不知道有没有⼈考虑过,如下命令的执⾏顺序是什么?在某些场景下是否存在副作⽤?
command1 && command2 &
实验分析
例⼀ 验证命令执⾏顺序
创建脚本 test_a.sh:
#!/bin/bash
echo "test_a.sh begin"
sleep 5 && echo "sleep 5" &
echo "test_a.sh end"
运⾏ sh test_a.sh,执⾏结果:
root@ubuntu:/home/permitted# sh test_a.sh
test_a.sh begin
test_a.sh end
root@ubuntu:/home/permitted# sleep 5
结果分析:
通过脚本实测可以发现,命令的执⾏顺序为 (command1 && command2) &,即
sleep 5 && echo "sleep 5"
被整体放在后台执⾏,所以现象为 “test_a.sh begin” 和 “test_a.sh end” 的打印⼏乎同时出现,⽽ “sleep 5” 的打印等待了5秒钟才出现。
例⼆ command2为周期任务时的副作⽤
创建脚本 test_b.sh
#!/bin/bash
echo "test_b.sh begin"
[ -f test_c.sh ] && sh test_c.sh &
echo "test_b.sh end"
创建脚本 test_c.sh
#!/bin/bash
echo "test_c.sh running"
while [ true ]
do
sleep 5
#此处可以添加周期任务的具体操作
done
运⾏ sh test_b.sh,执⾏结果:
root@ubuntu:/home/permitted# sh test_b.sh
test_b.sh begin
test_b.sh end
root@ubuntu:/home/permitted# test_c.sh running
从执⾏结果表⾯上来看,脚本test_b.sh已经完成了功能,脚本test_c.sh的后台周期任务也已经启动,似乎⼀切没有什么问题。
但如果⽤ps命令查看当前的进程,可以惊喜的发现test_b.sh的脚本并没有释放:
root@ubuntu:/home/permitted# ps aux | grep test_ | grep -v grep
root    12244  0.0  0.1  4208  644 pts/1    S    02:30  0:00 sh test_b.sh
root    12245  0.3  0.2  4204  1272 pts/1    S    02:30  0:00 sh test_c.sh
对此,个⼈理解为command1 && command2同时在后台执⾏时,因为command2为周期任务不会退出,那么整个&&的表达式的结果就没法返回,⽽test_b.sh需要等待所有命令结束后才能退出,故此时test_b.sh会⼀直存在,没有结束。
我们对 test_c.sh 进⾏如下修改:linuxshell脚本怎么运行
#!/bin/bash
echo "test_c.sh running"
while [ true ]
do
if [ -f test_exit.ini ]
then
exit
fi
sleep 5
#此处可以添加周期任务的具体操作
done
此时重复上述操作,当我们创建test_exit.ini的⽂件时,test_b.sh和test_c.sh均正常结束,可见test_b.sh在等待test_c.sh完成后才退出。
实际中遇到的问题
问题现象
对设备进⾏恢复出⼚设置,即:
umount掉U盘上的⽤户配置分区
将这部分⽤户配置分区进⾏格式化
但在第⼀步时出现Device is busy,恢复出⼚设置失败。
问题定位过程
⾸先分析出现Device is busy的原因:某个程序正在使⽤U盘上的⽬录,造成该⽬录不能卸载
通过leof命令抓取该⽬录的占⽤进程,发现是启动脚本,⽽启动脚本居然在启动结束后没有退出
通过调试启动脚本发现其问题代码如下:
cd /conf                                #该⽬录为U盘⽬录,此时该路径被占⽤
[ -f ] && sh ntp_task.sh &    #此处造成启动脚本未结束,即U盘路径始终被占⽤
总结
1.路径也是⼀种资源,当进⼊其它路径处理完问题后应该退回到原有路径下
2.定位⽬录或⽂件资源未释放的问题时,可以使⽤leof命令抓取⽂件资源情况进⾏分析
3.以前⼀直以为Shell的运⾏顺序为从左到右依次执⾏,实际上并不是,以后使⽤&&或||等命令时需要特别注意

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。