免费注册 查看新帖 |

Chinaunix

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

[其他] 求助一个shell脚本的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-22 18:49 |只看该作者 |倒序浏览
shell脚本unload_8738.sh:
  1. #!/bin/ksh

  2. #切换脚本当前工作目录
  3. cd $1
  4. if [ $? -ne 0 ]; then
  5.     date '+%Y%m%d  %H:%M' >> unload_8738_err.log
  6.         echo "cd $1 error" >> unload_8738_err.log
  7.         exit
  8. fi

  9. #检查当前系统运行脚本unload_8738.sh进程数
  10. #如果进程数大于1则退出执行
  11. P=`ps -ef | grep "unload_8738.sh" | grep -v "grep" | wc -l`
  12. if [ $P -gt 1 ]; then
  13.     date '+%Y%m%d  %H:%M' >> unload_8738_err.log
  14.         echo "unload_8738.sh is runing, pid num: $P" >> unload_8738_err.log
  15.         exit
  16. fi

  17. #开始生成对账文件之前检查OK文件,如果已存在则删除
  18. if [ -f "$2.OK" ]; then
  19.     /bin/rm $2.OK
  20. fi

  21. while [ 1 == 1 ]; do
  22. dbaccess $AP_DATABASE_NAME <<!
  23. set lock mode to wait 120;

  24. --开始提取对账文件数据
  25. unload to $2.temp
  26. SELECT *
  27. FROM CC_Info
  28. WHERE name in ('$3', '$3XYK')
  29. AND   date>= '$4' AND date <= '$5';

  30. set lock mode to wait 30;

  31. !

  32. if [ $? -ne 0 ]; then
  33.     date '+%Y%m%d  %H:%M' >> unload_8738_err.log
  34.         echo "unload 8738 data error" >> unload_8738_err.log
  35. else
  36.         break
  37. fi
  38. done

  39. while [ 1 == 1 ]; do
  40. P=`ps -fu cbs | grep "unload_8738.sh" | grep -v "grep" | wc -l`
  41. if [ $P == 1 ]; then
  42.     #去掉文件行末尾"|"字符
  43.     sed 's/|$//' $2.temp > $2
  44.    
  45.     #统计对账记录数,并追加至对账文件末尾
  46.     lCn=`wc -l $2 |awk '{print $1}'`
  47.         echo "--------------------------------------------" >> $2
  48.         echo $lCn >> $2
  49.         /bin/rm $2.temp
  50.    
  51.         #生成OK文件
  52.         echo "unload file $2 done!!!" > $2.OK
  53.         break
  54. fi

  55. sleep 60
  56. done
  57. exit
复制代码
我每次运行的时候: unload_8738.sh /home/acs DZ.txt 20160721 20160722
非常确认第一次运行脚本已经执行完成,而且相应的OK文件也已经生成了,脚本成功退出,但是第二次运行会报错:
日志:
  1. unload_8738.sh is runing, pid num:        2
  2. 20160722  18:32
  3. unload_8738.sh is runing, pid num:        2
  4. 20160722  18:32
  5. unload_8738.sh is runing, pid num:        2
  6. 20160722  18:33
  7. unload_8738.sh is runing, pid num:        2
复制代码
看了一下代码 是 P=`ps -ef | grep "unload_8738.sh" | grep -v "grep" | wc -l` 获取进程数大于1
我很纳闷,第一次脚本已执行完,确认退出了,哪里来的进程大于1呢?难道操作系统进程也会有缓存?
我运行的操作性是 AIX 6.1  shell 用的是 ksh
求解啊,谢谢各位!

论坛徽章:
0
2 [报告]
发表于 2016-07-22 19:02 |只看该作者
补充一下,这种情况,不是每次都会发生,是偶尔,频率还是挺高的

求职 : 技术支持/维
论坛徽章:
0
3 [报告]
发表于 2016-07-22 20:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2016-07-22 20:47 |只看该作者
嗯,试试看,先谢谢这位兄弟!回复 3# 99超人


   

论坛徽章:
0
5 [报告]
发表于 2016-07-22 21:31 |只看该作者
回复 3# 99超人

第13行代码该了一下:
  1. #检查当前系统运行脚本unload_8738.sh进程数
  2. #如果进程数大于1则退出执行
  3. P=`ps -fu cbs | grep "unload_8738.sh" | grep -v "grep"`
  4. CN=`echo "$P"| wc -l`
  5. if [ $CN -gt 1 ]; then
  6.     date '+%Y%m%d  %H:%M' >> unload_8738_err.log
  7.     echo "unload_8738.sh is runing, pid num: $P" >> unload_8738_err.log
  8.     exit
  9. fi
复制代码
出问题时打印的日志:
  1. 20160722  20:52
  2. unload_8738.sh is runing, pid num:      
  3. cbs  1638682 11862104   0 20:52:08  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
  4. cbs  9503448  1638682   0 20:52:08  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
  5. 20160722  20:52
  6. unload_8738.sh is runing, pid num:
  7. cbs 10223758 11862104   0 20:52:15  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
  8. cbs 15204796 10223758   0 20:52:15  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
  9. 20160722  20:52
  10. unload_8738.sh is runing, pid num:
  11. cbs  4653212  9503474   0 20:52:17  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
  12. cbs 10879294 11862104   0 20:52:17  pts/3  0:00 /bin/ksh /cbs/bin/unload_8738.sh /cbs/ftp DZ20160413IBPS IBPS 20160729 20160730
复制代码

论坛徽章:
0
6 [报告]
发表于 2016-07-22 22:10 |只看该作者
看样子是有子进程了,shell本身会fork子进程?语法如何写才能实现不包括他派生的子进程? 求大神支招

求职 : 技术支持/维
论坛徽章:
0
7 [报告]
发表于 2016-07-22 23:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2016-07-23 02:04 |只看该作者
回复 7# 99超人
先谢谢这位兄弟,也是个很好的方法,我觉得ps进程的查看一定是有办法区别主进程fork的子进程的

   

论坛徽章:
0
9 [报告]
发表于 2016-07-25 08:41 |只看该作者
不要沉,大家在帮我看看除了判断一个文件是否存在的方式,如何从判断进程的方式去解决呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP