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

news/2024/7/5 1:42:35

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言:我在使用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失败。


转载于:https://my.oschina.net/lionel45/blog/361932


http://lihuaxi.xjx100.cn/news/247492.html

相关文章

如何用ABAP代码读取CDS view association的数据

我有如下一个CDS view, 这个view的数据来自CRMD_ORDERADM_H, 定义了一个名称为_statushelp的association, 指向了另一个CDS view Z_C_Status_Valuehelp.该view暴露了两个字段STATUS_KEY和STATUS_TEXT. 现在我的需求是:在ABAP代码里只需要一次读操作,既能…

Google推荐的15条HTML 5代码军规----来看看你知道几个,我一个都不知道。。。

Google规范的原文链接大家可以访问:http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml  1.协议头:  建议在指向图片或其他媒体文件、样式表和脚本的URL地址中省略http:https:协议部分,除非已知相应文件不能…

WCF实现RESTFul Web Service

共同学习了前面一些概念,终于开始正题了哈。RESTful的Web Service调用直观,返回的内容容易解析。这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名,返回完整个人信息。下面我们一步步用WCF实现一个RE…

torch.argmax()torch.max()函数用法

函数原型 torch.argmax(input, dimNone, keepdimFalse)作用:返回指定维度最大值的序号。 示例: x torch.randint(12, size(3, 4)) print(x) y torch.argmax(x, dim0)#返回每列最大值对应的行号 print(fy.shape{y.shape}) print(y) z torch.argmax(…

小波变换介绍

从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路。 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺…

5 配置邮箱服务器

配置邮箱服务器 一邮箱服务器角色 当Exchange邮件服务器使用一段时间后可能面临以下几个问题:邮箱服务器的磁盘空间出现不足、如何将数据库文件移到新的硬盘上、如何共享一些文件给指定的人;为了解决这些问题,我们就要了解邮箱服务器中的邮件…

curl命令具体解释

对于windows用户假设用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,由于路径已经自己主动给你配置好了。 linux …

json

evernote免费版的流量被我用光了,暂时把这当笔记本使..想写篇json相关的文章总结一下(其实不太知道想说啥 可能是这篇文章很多部分内容老旧可以修改一下)...先挖个坑,把之前一篇的一部分剪到这.. JSON (JavaScript Object Notatio…