我正在調試這個腳本的工作 - 老闆說,這是用於在Solaris上工作,但自從他們切換到Linux,它停止工作。我必須嚴格和警告地重寫它。 當我運行它,我得到錯誤:未定義的子程序和包::調用子程序<of script>
Undefined subroutine &Logging::openLog called at /path/to/script line 27
這裏是腳本(以及它的一部分)
1 #!/usr/local/bin/perl
2
3 unshift @INC, "/production/fo/lib";
4 use strict;
5 use warnings;
6 use Sys::Hostname;
7 use Getopt::Long qw(:config bundling auto_version);
8 use File::Path;
9
10 require "dbconfig2.pl";
11 require "logging2.pl";
12 require "hpov.pl";
13
14 # global variables
15 my $parseDate = "";
16 my @fileList = "";
17 my @transList = "";
18 my $mLogDate = "";
19 my $lHost = hostname;
20 my $corefiles_dir="/production/log/corefiles";
21 my $default_Threshold=90;
22
23 # do stuff
24
25 parseOptions();
26 Dbconfig::readconfigFile("$config");
27 Logging::openLog("$Dbconfig::prefs{logFile}","overwrite");
28 # msglog actions TODO logs, compress only, data files
29 my $check_shdw=`ls -l /etc/motd | awk '{print \$11}' | grep 'motd.shdw'`; #Check if hostname is shadow
30 $check_shdw =~ y/\n//d; #remove new line if any
31 if ($check_shdw eq "motd.shdw")
32 {
33 Logging::printLog("INFO","Enviroment is Shadow, triggering core files compressing");
34 if (is_folder_empty($corefiles_dir)) {
35 print "Corefile Directory is EMPTY......! \n";
36 }
37 else {
38 gzip_corefiles() ; #Execute compress core files
39 }
40 }
41
腳本使用要求語句我想在腳本創作者建立的程序調用。 對於這個腳本的說明--dbconfig只是在配置文件中徘徊,並將它們分解爲值。 就像「$ Dbconfig :: prefs {logFile}」等於一個日誌文件位置/prod/logs/script.log - 就是這樣。
#!/usr/local/bin/perl
package Dbconfig;
#use warnings;
use DBI;
use DBD::Oracle;
%prefs = "";
@$dbPrefs = "";
$raiseError = 0;
%startupItem = "";
# readconfigFile(file) - read in a configuration file.
sub readconfigFile {
my $file = shift;
if (! -e $file) {
$errorTxt = "Error: $file does not exist.\n";
$raiseError = 1;
}
# read in the cfg variables
open(CFGFILE,"<","$file") or die "Cannot open $file for reading: $!\n";
while(<CFGFILE>) {
chomp; # kill newlines
s/#.*//; # ignore comments
s/^\s+//; # ignore leading whitespace
s/\s+$//; # ignore trailing whitespace
next unless length;
my($var,$value) = split(/\s*=\s*/, $_, 2);
$prefs{$var} = $value;
}
close(CFGFILE);
}
然後就有這個日誌包。在腳本的第27行(出現錯誤的地方),我看到一個「覆蓋」調用,但在logging.pl包中沒有看到任何引用覆蓋的內容 - 但不確定它是否重要。父腳本似乎沒有寫入任何日誌文件。我甚至不確定文件句柄LOGFILE是否被創建。
#!/usr/local/bin/perl
package Logging;
use File::Copy;
use warnings;
use strict;
my $timestamp = "";
my $filestamp = "";
# openLog(logfile name) - opens a log file
sub openLog {
my $file = shift;
my $rotate = shift;
# force a rotation if it exists.
if (-e $file && $rotate eq "rotate") {
print "Warning: $file exists. Rotating.\n";
rotateLog($file);
}
getTime();
open(LOGFILE,">","$file") or warn "Error: Cannot open $file for writing: $!\n";
print LOGFILE "[$timestamp] - Normal - Opening log for $file.\n";
}
# rotateLog(log file) - rotate a log.
sub rotateLog {
my $file = shift;
getTime();
openLog("$file");
print LOGFILE "[$timestamp] - Warning - Rotating $file to $file.$filestamp.log";
closeLog($file);
move($file,$file-"$filestamp.log");
openLog($file);
}
time() - grab timestamp for the log.
sub getTime {
undef $timestamp;
undef $filestamp;
($sec,$min,$hour,$mday,$mon,$year) = (localtime(time))[0,1,2,3,4,5];
$sec = sprintf("%02d",$sec);
$min = sprintf("%02d",$min);
$hour = sprintf("%02d",$hour);
$mday = sprintf("%02d",$mday);
$year = sprintf("%04d",$year +1900);
$mon = sprintf("%02d",$mon +1);
$timestamp = "$mon-$mday-$year $hour:$min:$sec";
$filestamp = "$year$mon$mday$hour$min$sec";
}
只是想知道 - 是否有問題logging.pl調用dbconfig.pl在第27行的東西?像一個模塊可以調用另一個模塊的值嗎?除了使用嚴格和警告以及大量的打印語句之外,我不知道我的下一個調試步驟是什麼。我不知道如何檢查並看到LOGFILE文件句柄正在創建 - 如果它沒有出錯,我只能假設它是。像是有什麼額外的,我必須做的讓模塊相互交談?
我不是腳本王 - 只是我這個行中唯一能夠理解這個東西的人。
「只是想知道 - logging.pl在第27行調用了dbconfig.pl中的某些內容時出現了問題嗎?」那麼,它是否工作,如果你在main調用dbconfig的東西,將它存儲到一個字符串和調用日誌記錄? – DeVadder
你應該知道''openLog'並沒有做它所做的事情。它試圖保護舊日誌(如果它存在的話),然後它調用'rotateLog',它會再次調用'openLog',截斷該文件,然後備份截斷的日誌。這些代碼中的大部分可以通過模塊更好地處理,比如處理日誌文件的模塊,讀取/寫入配置文件,創建時間戳。 – TLP