perl 编程 - 判断系统进程是否活着的方法
前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。 perl编程中判断系统进程是否存活的方法尽量使用perl自己的语句,而不是使用system函数来调用,除非对system语句非常了解,否则会出现很多意想不到的问题。 举例:我们检测pptpd进程是否还活着 #!/usr/bin/perl -w chomp $pptpd_stat; if ( $pptpd_stat eq '' ) { ??? open ( DATA,">/var/www/cgi-bin/vpn/pptpd.tmp" ); ??????? print DATA "pptpd is die"; ??? close DATA; }else { ??? open ( DATA,">/var/www/cgi-bin/vpn/pptpd.tmp" ); ??????? print DATA "pptpd is alive"; ??? close DATA; } system "cat pptpd.tmp"; 结束 提示:假如使用perl写CGI程序,而CGI程序的属主是apache,这里判断pptpd进程的时候应该使用的正确的命令应该是ps -ef|grep pptpd|grep -v grep。之前我在调试程序时百思不得其解,原来是这里的原因,引以为戒。 找到这个问题的方法是,my $pptpd_stat = `ps -ef|grep pptpd|grep -v grep > /tmp/sss`;然后查看/tmp/sss apache?? 11670 11668? 0 15:07 ???????? 00:00:00 grep pptpd 就明白问题的原因了,把命令语句输出到/tmp目录下是一个很好的调试方法,利用/tmp目录的特殊性。 经验:使用ps判断进程的时候,千万不要这样写ps -ef|grep pptpd|grep -v root,过滤掉用户来清除干扰的方法不是一个好方法,因为你的perl程序很可能是在其他身份下执行的比如apache,而ps -ef|grep pptpd|grep -v apache又会过滤掉所有,所以最好的习惯是ps -ef|grep pptpd|grep -v grep。^_^ 注意:perl在调用system函数的时候,system函数中直接获取shell语句的$?返回值时,千万别忘了所有的$符号都要使用转义符,否则返回值可能不是你想要的结果。比如下面的语句 system函数中的两条shell语句在shell中执行结果是相同的,但是在perl程序中,执行结果不同。
system "ps -ef|grep pptpd|grep -v root;echo $?";??? 错误语句 说明:经过实验system函数执行后可以输出shell命令的执行结果,但这个结果不能赋予变量,赋予变量的话可以使用反引号,因为system函数在perl中以子进程执行,执行结果直接输出,赋予变量的话只能返回shell语句是否执行成功的值,成功标准也遵守shell的评判标准而不是perl的标准,即0成功1失败。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |