设为首页 收藏本站
查看: 1160|回复: 0

[经验分享] Perl-进程管理

[复制链接]

尚未签到

发表于 2017-5-17 07:02:32 | 显示全部楼层 |阅读模式
Perl-进程管理

1.system函数
在perl中,启动子进程最简单的方法是用system函数。
1.1 简单命令
例如要从perl调用Unix的date命令,需要启用如下代码:
     system "date";
这回创建一个子进程来运行date命令,并且它继承了perl的标准输入,标准输出和标准出错。这意味着date通常输出的日期时间字符串并会送到目前perl的STDOUT指向的地方。
1.2 复杂命令
比较复杂的命令要放在参数里:
比如:
    system 'ls -l $HOME';
请注意这里的 $HOME是shell变量,所以用的不是双引号,而是单引号。否则,因为美元符号也是perl进行变量内插的符号,所以shell看不到它。
2 exec函数
到目前为止,我们提到的system所有的语法都适用于exec函数,当然有一个例外,system函数会创建子进程,子进程会在perl休眠时执行任务。而exec函数却导致perl进程自己去执行任务。这类似于子程序调用与goto的差别。
比如:
  exec "bedchock", "-o","args1",@ARGV;
当运行到exec操作符时,perl会找到bedchock程序并且“跳进去”执行,就不会再有perl进程了,只有那个bedchock进程。
一旦启动要执行的程序,Perl便会自动放手退出,因此exec调用之后写的代码都不发运行,除非在编程接管启动过程中的错误:
exec "date";
die "date could't run:$!";。
3.用反引号捕获输出结果
无论用system还是exec,被调用程序的输出都会定向到Perl的标准输出。有时候我们感兴趣就在于捕获输出的字符串,并进一步处理。这其实只要以魔力反引号来代替单引号和双引号。
   open DATE, "date|" or die "cannot pipe from date: $!";
   my $now = `date`;
   print "The time is $now";
当我们把date放在反引号里时,Perl会执行这个命令并将其标准输出结果一字符串的形式捕获。在这个例子中,字符串会赋给$now。
4.将进程视为文件句柄
到目前为止,我们看到的方法都是由Perl同步控制子程序:启动一个命令,然后等着它结束或许还会捕获其结果输出。但是perl其实也可以启动一个异步运行的子程序,并和他保持通信,直到子程序结束为止。
例如:

open DATE "date|" or die "cannot pipe from date:$!";
my $now = <DATE>;
print "The time is now $now";


上面的例子,竖线在命令的右边,表示该命令执行时他的标准输出会转向只读文件句柄DATE。
为什么要用文件句柄的方式和进程打交道呢,假如要根据计算结果来决定写到其它进程的数据,这是唯一简单做法。可是如果只想读取,反引号通常是易于使用。然而如果子进程不时有数据要送往父进程,就必须用管道了。

open F,"find / -atime +90 size +1000 -print |" or die "fork:$!";
while(<F>){
chomp;
printf "%s size %dK last accessed on %s\n", $_, (1023 + -s $_)/1024, -A $_;
}


find命令这次运行是要查找那些90天内未被存取过的1000块以上的大文件,他们非常适合被鬼党委永久性介质中。在find工作的时候,Perl会等待。没找到一个文件,perl会立刻收到文件名并进一步显示文件的相关信息工分析。如果我们用反引号的话,就得等到find彻底搜完才能看到第一行输出。从任务监控角度来说,往往看到执行的最新进展才能让人放心。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378238-1-1.html 上篇帖子: Perl之旅(一) 下篇帖子: perl encode,decode
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表