免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2020 | 回复: 0
打印 上一主题 下一主题

请教一个关于脚本执行时命令顺序无常和漏执行的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-19 22:50 |只看该作者 |倒序浏览
小弟接触Linux开发才几个月,这还是第一回完全由自己从头写的一个比较正式的脚本,结果就遇到了在脚本在很短时间内反复执行多次的情况下出现得命令顺序无常的现象,今天调试了一天也始终没有搞明白,所以只有上来向各位大虾虚心求教了。

    我目前正在开发一个嵌入式Linux的移动多媒体终端产品,今天我所写的是一个USB device和SDCard得热插拔脚本hotplug,在热插拔USB/SDCard后的极短时间内(具体时间我不清楚,但应该是1秒内),hotplug会被反复调用多次(具体的次数每次似乎也不一定,一般是7~8次),我在系统初始化的时候调用 cat /proc/diskstats >/var/tmp/old.txt,然后每次进入脚本后首先调用cat /proc/diskstats >/var/tmp/now.txt,然后通过gawk分别检验在 old.txt 和 now.txt 中是否有 USB(sd[a-z][1-9])或SDCard设备(mmcblk[0-9]p[0-9]),如果old和now中的情况不一致则表明硬件状态发生了变化,故进行mount或umount操作。我在每一次命令操作后都进行了是否成功的判断和信息重定向输出,另外对变量的关键性实时值也进行了重新向输出打印——都是输出到 /var/debug/a.txt 中。在脚本的最后exit 0之前,我都将使用 mv -f /var/tmp/now.txt /var/tmp/old.txt  对 old.txt 进行完全的重更新,以保证紧接着得下一次进入hotplug脚本时,old.txt是最近一次得/proc/diskstats的情况。
    然而我的脚本执行的结果却总是不能和我的本意完全一致,于是我在脚本中每次更新old.txt和now.txt的时候都另外同时执行 cat /proc/diskstats >>/var/debug_old.txt 和 cat /proc/diskstats >>/var/debug_now.txt 进行追加重定向到以方便观察脚本在高速反复调用过程中的执行情况。经过这样的分析,我发现在一次的热插/热拔操作前后,debug_old.txt 和 debug_now.txt 中确实显示出了每次进入hotplug脚本时的实时 /proc/diskstats 的情况,但是相应的在存放脚本中其他实时打印信息的 a.txt 中却出现了很多打印信息顺序错乱的情况。例如按照脚本命令的顺序,每次进入脚本后的打印信息顺序应该为:a-b-c-d-e-f-g,但是最后连续快速执行了三次脚本后 a.txt中显示出来的顺序却是a-b-a-b-c-d-f-a-b-c-c-d-e-f-e-f-g-g-g ,一些信息根本就没有打印出来,一些信息显示的顺序则完全不对,而且一次热插拔操作导致的连续七八次脚本调用过程中,每次脚本执行最后都要进行的形如 mv -f /var/tmp/now.txt /var/tmp/old.txt  && echo "renew old.txt success"的更新,但是七八次脚本执行却常常只有一两次的 renew old.txt success 更新成功的消息——更新不成功,自然下次进入脚本后的操作会出现问题了。
    我真的搞不明白这是为什么了,我曾经在最后 old.txt 更新前后都增加了 sleep 1 语句试图保证更新的正确和顺利,但是运行的结果仍然如前那样,并且连续执行七八次脚本的情况下按理说会运行十五六次sleep 1 语句而导致串口控制台明显的反应延迟,但是实际情况却似乎没有任何延迟,似乎好多次脚本执行时的更新语句以及前后的sleep语句都没有执行一样。
    虚心向大家请教了,谢谢!

[ 本帖最后由 zhouxiao_82 于 2008-2-19 22:56 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP