免费注册 查看新帖 |

Chinaunix

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

请教 Perl 如何判断调用的外部程序是否运行完毕 [复制链接]

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-22 21:59 |只看该作者 |倒序浏览
本帖最后由 yccpp 于 2015-04-22 22:01 编辑

请教大家一个问题,我在用system 调用外部程序后,这个程序需要运行一段时间才能结束,后面的命令是对这个外部程序计算的结果进行数据处理。参数不一样时,这个外部程序运行的时间也不一样且相差较大。我用的一个笨办法是使用sleep命令,让perl程序暂停执行一段时间,让外部程序能够运行完毕。想请教大家perl是否可以判断这个外部程序运行完毕并开始执行后面的命令。谢谢。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-04-22 23:08 |只看该作者
如果在一个进程内,下一个动作总是会等到上一个进程完成才会行动。

除非你新开一个进程,让这个进程去做等待的事情,只需要设置一个时间频率,定期向主进程汇报等待的结果。而主进程继续做其他的事情,如果主进程没有这个新进程的结果,就无法继续进一步的行动的话,无论如何也要等,哪怕天荒地老。

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 谢谢指点

查看全部评分

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
3 [报告]
发表于 2015-04-23 19:52 |只看该作者
回复 2# 104359176


    谢谢,对Perl 不是很熟,我搜一下如何设置时间频率,不成功再向您请教。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2015-04-23 21:38 |只看该作者
回复 1# yccpp

$ perl sys.pl
Thu Apr 23 21:35:32 2015
Thu Apr 23 21:35:33 CST 2015
Thu Apr 23 21:35:43 CST 2015
Thu Apr 23 21:35:43 2015


$ cat sys.pl
use strict;
use warnings;

print localtime() . "\n";
system("date;sleep 10;date");
print localtime() . "\n";

   

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
5 [报告]
发表于 2015-04-24 16:24 |只看该作者
本帖最后由 yccpp 于 2015-04-24 16:55 编辑

回复 4# jason680


谢谢指点,我还是不太明白二楼的做法。看Perl的说明, 如果使用 system("command"),将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码。在我的程序中,引号中的命令是调用另外一个专业软件,这个软件要运行几个小时,后面的程序需要用到这个软件计算的结果。如果不使用sleep 命令,程序直接执行system("command")后面的命令而没有等待子进程的结束再执行。

调用的外部程序在另外一个文件夹中运行,不知是否是这个原因导致后面的命令没有等待。

论坛徽章:
0
6 [报告]
发表于 2015-06-06 08:26 |只看该作者
我做的系统每天晚上做的自动数据处理 经常有你这种情况。
我的做法是分成两个pl文件,第一个程序开始运行,就在mysql的某个表(只有一行)某字段置为1,运行完毕后改为0 。
第二个程序每隔1分钟(linux的cron或者windows的计划任务)去检查mysql这个字段的值,是1就退出,1分钟后再启动检查,是0就继续执行后续的动作。

如果不愿意用数据库,可以用文件,第一个pl程序开始执行,生成一个特殊名字的文件,执行完成后删除。
第二个程序去检查这个文件是否存在。

论坛徽章:
0
7 [报告]
发表于 2015-06-23 20:21 |只看该作者
system就阻塞式命令,就是程序必須等待system調用的指令執行完畢才開始下一行代碼,所以無須檢查。exec才是甩不理會,也就是說使用exec調用其他命令時不需要等待,程序直接執行下一行代碼。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP