免费注册 查看新帖 |

Chinaunix

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

[其他] shell并发管理wait命令不起作用 [复制链接]

论坛徽章:
1
午马
日期:2013-08-21 12:56:14
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-07 14:51 |只看该作者 |倒序浏览
本帖最后由 guofeng2068 于 2013-03-07 15:09 编辑

各位好。我在使用shell调用freebcp进行SQLServer数据库数据的导出工作。因为要导出的数据表比较多,因此,打算使用并发提高处理速度。编程示意如下:
awk -F: '{print $1,$2}' databaseandtablenames.info | while read databasename tablename
do
(
freebcp $databasename.dbo.$tablename out $databasename.$tablename.dat -c -t, -S DBLink -U Username -P userpasswd
sleep 5
)&
done
wait
# do other things.such as
cat $databasename.$tablename.dat
...
其中,databaseandtables.info中包含多个数据库名及表名,如下
dbname1:tablename1
dbname2:tablename2
...
因为各个表的数据量不相同,freebcp完成所需要得时间并不相同。在程序执行的时候,会产生提示:
cat:dbname2.tablename2.dat文件不存在
可以确定,freebcp可以正常完成。
请问各位:
为什么会出现这种状况?
跟sleep的时间有没有关系?
有没有更好的控制方法?
谢谢

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 2013-03-07 15:22 |只看该作者
你那个 while 是一个管道生成的,你cat $databasename.$tablename.dat这里的变量是没有值的,你确定提示的是“cat:dbname2.tablename2.dat文件不存在”吗?
请看示例,这个 va 变量在 while 之后是没有内容的。
  1. [seesea@UC ~]$ echo "a" | while read va; do echo "In: $va"; done; echo "Out: $va";
  2. In: a
  3. Out:
  4. [seesea@UC ~]$
复制代码

论坛徽章:
1
午马
日期:2013-08-21 12:56:14
3 [报告]
发表于 2013-03-07 15:33 |只看该作者
回复 2# seesea2517

不好意思,这里我没有说清楚。cat $databasename.$tablename.dat中的$databasename、$tablenames不是直接使用上面个while中的$databasename、$tablename变量名称,这个仅仅拿来作为示例,说明要查看文件的名称。我疏忽了。

请问,能不能再帮忙看一下并发的问题?


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 2013-03-07 15:34 |只看该作者
回复 1# guofeng2068


& 加的位置不对,加在整个循环外面,里面的 freebcp 还是串行的。

freebcp $databasename.dbo.$tablename out $databasename.$tablename.dat -c -t, -S DBLink -U Username -P userpasswd &

论坛徽章:
1
午马
日期:2013-08-21 12:56:14
5 [报告]
发表于 2013-03-07 15:51 |只看该作者
回复 4# ly5066113
为什么说&符号加在了循环外面呢?括号括住的部分是while循环do与done之间的部分,那么这部分应该是作为一个整体进行后台并发执行的,freebcp与sleep之间是串行的关系吧?
我这样理解不知道对不对,请您批评指正。


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2013-03-07 16:08 |只看该作者
回复 5# guofeng2068


是我看错了,不过你的 sleep 写在里面,应该达不到你的预期效果吧。
对 freebcp 也不了解,改成这样试试:

awk -F: '{print $1,$2}' databaseandtablenames.info | while read databasename tablename
do
    freebcp $databasename.dbo.$tablename out $databasename.$tablename.dat -c -t, -S DBLink -U Username -P userpasswd &
    sleep 5
done

论坛徽章:
1
午马
日期:2013-08-21 12:56:14
7 [报告]
发表于 2013-03-07 16:38 |只看该作者
回复 6# ly5066113

freebcp是freeTDS软件里面的一个插件,可以实现在linux下对远程windows下SQLServer数据库中的表进行数据查询导出。示例里面是它的一个典型的用法。也可以在Terminal中直接执行freebcp xxxx,与date之类命令的用法非常相似。
对于你说的方法,我实验了一下,又将并发全部去掉实验了一遍,发现后者花费的时间好像更少一些{:3_198:}
再,对你说的方法,如果将"sleep 5"更改成“echo $databasenametablename >>OtherFile”,并发还能不能提高脚本运行的速度呢?
   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
8 [报告]
发表于 2013-03-07 16:50 |只看该作者
回复 7# guofeng2068


脚本的运行速度和数据的导出速度是2个概念。
单纯的从脚本运行速度来说,去掉 sleep 5 肯定会提高运行速度,而且循环的次数越多提高的就越多,但对后台的 freebcp 导出数据的速度是没有任何影响的。

论坛徽章:
1
午马
日期:2013-08-21 12:56:14
9 [报告]
发表于 2013-03-07 17:07 |只看该作者
回复 8# ly5066113
这样说你看对吗:在循环中,最好仅有freebcp一行命令,且后台实现。

还有,回到我最初的问题,如果有两张表,假设两张表的列数相同,表A有200行数据,表B有2000000行数据,那么进行数据导出的话,花费的时间肯定是不相同的。我想使用wait方法,等freebcp将两张表的数据都导完之后,再执行后面的cat命令。

但在实验的时候经常出现的问题是:先显示表A已经导出完毕,再,执行了cat命令,显示错误:本地与表B相关的文件不存在,后,显示表B导出完毕。

为什么会出现这种情况?wait命令不是表示等前面所有的子线程执行完毕之后才执行其后面的命令么?


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
10 [报告]
发表于 2013-03-07 18:13 |只看该作者
回复 9# guofeng2068


是不是 freebcp 命令本身已经是后台执行的命令了?
就是运行 freebcp 时,不管表的记录数有多大,没有等待时间,命令都是马上就结束了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP