求解释这个perl脚本,非常感谢

2025-03-11 09:09:03
推荐回答(1个)
回答1:

warning:Use of uninitialized value in pattern match (m//) at processMonitor.pl line 38
上面这个warn是因为while循环条件里面少了东西,这里应该是这个句柄
另外,那个exec要执行logger,这个程序有的不在/bin目录下,而在/usr/bin目录下

这个程序大致意思是查看指定的程序是在ps列表中出现的次数

例如,你在命令行执行这个程序
./processMonitor.pl ps klogd
就可以在生成的log文件中看到结果了

下面给你稍微加了些注释,如果基本语法比较熟悉的话,应该可以看懂了

#!/usr/bin/perl -w
#
#name: processMonitor.pl
#written by trizsolo
#usage: ./processMonitor.pl args args args
#you can add as many processes as needed for args
#or use the defaults... syslogd is always checked
#----------------------------
my $user='root';
my $host=`hostname`;
chomp($host);
my $date=`date`;
chomp($date);
my $logfile="$host" . '.log';#以主机名加log后缀的形式命名日志文件
our @proc_list=@ARGV;
# Default list of processes
if(@proc_list==0)#如果不在命令行指定程序名,则默认查看下面的三个程序
{
# check for arguments
@proc_list=('inetd', 'sendmail', 'chkMounts.pl');
}
push(@proc_list, 'syslogd');
# add syslogd to check

# ---------- open logfile and determine Operating System --------------
#以添加的方式打开日志文件,并把要查看的程序名称,日期及系统信息添加到日志文件
open(LOG, ">>$logfile") or die "Can't open $logfile to write: $!";
print LOG "Searching for: @proc_list on $date!\n";
chomp($os=`uname -r`);
print LOG "OS on this server is $os\n";
close(LOG);

# ---------------- call "ps" & analyse output --------------------
#初始化哈希计数表,用来统计指定程序在列表中出现的次数
foreach my $process (@proc_list)
{
$event_count {$process} = 0;
}
#使用管道,使ps的输出作为下面匹配的目标
open(PS, "/bin/ps auwx |") or die "Can't run ps: __FILE__ $!";
$/="\n";
# record seperator
#这个while原来少了东西,应该有上面打开的句柄
while()
{
foreach my $process(@proc_list)
{
if($_ =~(m/$process/i))
{
$event_count {$process}++;
}
}
}
close(PS);
再次打开日志文件,把上面遍历ps列表后的信息写入日志文件
open(LOG,">>$logfile") or die "Cannot open $logfile: $!";
# Add line to log to nagios if needed
foreach $process(@proc_list)
{
if($event_count {$process} ==0)
{
print LOG "Process $process is NOT running!\n";
#这里的logger有的在/usr/bin目录下
system("/bin/logger -p warn Process: $process is NOT running!\n")
== 0 or die "Cannot complete cmd: $! : $?";
}
else
{
print LOG "Process $process occurred $event_count{$process} times!\n";
}
}
close(LOG);
exit 0;
#EOF