前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。
perl编程中判断系统进程是否存活的方法尽量使用perl自己的语句,而不是使用system函数来调用,除非对system语句非常了解,否则会出现很多意想不到的问题。
举例:我们检测pptpd进程是否还活着
#!/usr/bin/perl -w
use strict;
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 "ps -ef|grep pptpd|grep -v root;echo \$?"; 正确语句
system "ps -ef|grep pptpd|grep -v root;status=\$?;echo \$status"; 正确语句
说明:经过实验system函数执行后可以输出shell命令的执行结果,但这个结果不能赋予变量,赋予变量的话可以使用反引号,因为system函数在perl中以子进程执行,执行结果直接输出,赋予变量的话只能返回shell语句是否执行成功的值,成功标准也遵守shell的评判标准而不是perl的标准,即0成功1失败。
总结以上是内存溢出为你收集整理的perl 编程 - 判断系统进程是否活着的方法全部内容,希望文章能够帮你解决perl 编程 - 判断系统进程是否活着的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)