加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl 编程 - 判断系统进程是否活着的方法

发布时间:2020-12-15 23:49:29 所属栏目:大数据 来源:网络整理
导读:前言: 我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的 好习惯。 perl编程中判断系统进程是否存活的方法尽量使用perl自己的语句,而不是使用system函数来调用,除非对system语句非常了

前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。

perl编程中判断系统进程是否存活的方法尽量使用perl自己的语句,而不是使用system函数来调用,除非对system语句非常了解,否则会出现很多意想不到的问题。

举例:我们检测pptpd进程是否还活着

#!/usr/bin/perl -w

use strict;

my $pptpd_stat = `ps -ef|grep pptpd|grep -v grep`;
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失败。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读