2013-12-10 77 views
0

我正在調試這個腳本的工作 - 老闆說,這是用於在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文件句柄正在創建 - 如果它沒有出錯,我只能假設它是。像是有什麼額外的,我必須做的讓模塊相互交談?

我不是腳本王 - 只是我這個行中唯一能夠理解這個東西的人。

+0

「只是想知道 - logging.pl在第27行調用了dbconfig.pl中的某些內容時出現了問題嗎?」那麼,它是否工作,如果你在main調用dbconfig的東西,將它存儲到一個字符串和調用日誌記錄? – DeVadder

+1

你應該知道''openLog'並沒有做它所做的事情。它試圖保護舊日誌(如果它存在的話),然後它調用'rotateLog',它會再次調用'openLog',截斷該文件,然後備份截斷的日誌。這些代碼中的大部分可以通過模塊更好地處理,比如處理日誌文件的模塊,讀取/寫入配置文件,創建時間戳。 – TLP

回答

3

不知道這是否會影響的事情,但....

1)包需要返回true,正常的程序是結束文件與線:

1; 

保證。

2)即使世界在記錄器包而不領先#這會導致編譯失敗了評論:

time() - grab timestamp for the log. 

3)這條線:

unshift @INC, "/production/fo/lib"; 

被添加的目錄搜索路徑模塊,請確保您的logging2.pl文件實際上位於該位置(否則您會得到不同的錯誤,但值得重複檢查)

+0

是的腳本底部有一個1(我很奇怪它爲什麼是那裏)缺少評論是我的錯(它在原始代碼中存在)並且logging2.pl文件位於正確的路徑中。感謝澄清。 – capser

1

看起來很像一切OK。

由於某些原因,雖然需要「logging2.pl」的作品(如果沒有的話會出現錯誤),其中的子例程沒有加載和可用。與DBconfig2.pl工作正常的負載不同(否則調用Dbconfig :: readconfigFile()將首先失敗)。

我只能看到Logging2中package命令的前導空格。嗯,不要認爲這很重要。

可以嘗試調用openLog而不使用包前綴(Logging :)以查看它是否由於某種原因加載到main中,並在require語句後打印%INC的內容以確保它已正確加載?