2012-06-18 50 views
11

一個小小的請求:我每天都會閱讀Stack Overflow的Perl問題,並回答/提供我所能提供的信息;今天我需要社區的幫助!什麼可能導致Perl系統調用開始失敗?

Perl設置:我在Windows上運行Active Perl 5.8.8。安裝位於我們的部門服務器的本地驅動器上,該驅動器也與網絡共享。所有部門用戶通過指向這個網絡安裝的Perl來在他們自己的PC上運行Perl。這已經工作了很多年,並沒有造成問題,但它是瞭解問題所需的一些信息。

有問題的服務器也是我們的「cron」(計劃任務)服務器,處理各種自動化任務。突然在上週,Perl腳本(服務器上)的系統調用開始失敗(詳情如下)。起初,我懷疑Perl的安裝是壞的,但是所有的客戶端PC仍然可以運行相同的Perl腳本而沒有任何問題,這導致我認爲這是一個服務器問題。我重新啓動了服務器兩次,問題仍然存在,因此我需要幫助!

下面是系統調用是失敗,歸結爲Perl的單行的各種方式的一些例子:

% perl -e "system('dir')" 

應打印一個「目錄」上市,而是它會打開一個子shell 。如果我輸入「exit」,我可以退出子shell,然後回到原始shell(通過使用UP箭頭鍵檢查shell歷史來確認)。

% perl -e "print `dir`" 

這實際上是掛起的。完全沒有任何反應。如果我按Ctrl-C殺死進程,則會收到消息「終止於信號SIGINT(2)」,並且DOS提示符會返回。但是,在DOS提示符下任何將來的命令(甚至只是敲擊ENTER)都會導致錯誤「該進程試圖寫入不存在的管道」。您必須退出DOS提示符,因爲它實際上是無用的。

最後例如:

% perl -e "system('Z:/Scripts/rebuild.pl')" 

「ebuild.pl」不被識別爲內部或外部的命令, 運行的程序或批處理文件。

在這種情況下,Perl會將正斜槓(/)切換到DOS/Windows反斜線(),這種做法多年來一直很好。但是,Perl正在將「rebuild.pl」文件名的開始處的「\ r」解釋爲回車符(我認爲)並尋找剩餘的「ebuild.pl」。調用其他腳本名稱,這些腳本名稱的字符不會被誤解爲導致上述情況(如果使用反引號)打開子shell(用於system()調用)。

我不只是困惑 - 我絕望!由於我們使用了大量系統調用,因此我們的部門服務器的「cron」作業現在毫無用處。

同樣,我不認爲這是一個損壞的Perl安裝,因爲網絡用戶可以正常運行。那麼,在單獨的機器上會發生什麼(而不是綁定到Perl安裝本身),可能會導致Perl的系統調用失敗?

環境設置,要求:

ALLUSERSPROFILE=C:\Documents and Settings\All Users 
APPDATA=C:\Documents and Settings\engmodem\Application Data 
CDSROOT=Z:\Cadence\SPB_16.5 
CDS_CONCEPT_NOSPLASH=TRUE 
CDS_LIC_ONLY=1 
CDS_SITE=Z:\Cadence\Sites\16.5 
CHDL_LIB_INST_DIR=%CDSROOT% 
CLIENTNAME=USENTUTTLJL3C 
ClusterLog=C:\WINDOWS\Cluster\cluster.log 
CommonProgramFiles=C:\Program Files\Common Files 
COMPUTERNAME=CORPUSAPP5 
ComSpec=C:\WINDOWS\system32\cmd.exe 
CONCEPT_INST_DIR=%CDSROOT% 
FP_NO_HOST_CHECK=NO 
HOMEDRIVE=H: 
HOMEPATH=\ 
HOMESHARE=\\PF1\HOME 
ICMHOME=Z:\Software\PTC\INTERC~1 
INSTDIR=%CDSROOT% 
LOGONSERVER=\\ENGMAHO5 
LSF_BINDIR=Z:\Software\LSF\bin 
LSF_ENVDIR=\\hwc151\LSF_6.2\etc 
MESSAGE=BROADCAST 
NUMBER_OF_PROCESSORS=2 
OA_PLUGIN_PATH=%CDSROOT%\Share\oaPlugIns 
OS=Windows_NT 
Path=C:\Program Files\Legato\nsr\bin;Z:\oracle\ora92\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Windows Resource Kits\Tools\;Z:\Software\Perl\5.8.8\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\Program Files\Support Tools\;Z:\Software\LSF\bin;C:\Program Files\PHP\;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\EMC RepliStor;C:\GitStack\python;C:\GitStack\python\Scripts;C:\GitStack\git\cmd;Z:\Scripts;Z:\bin;Z:\Cadence\SPB_16.5\tools\bin;Z:\Cadence\SPB_16.5\tools\fet\bin;Z:\Cadence\SPB_16.5\tools\pcb\bin;Z:\Cadence\SPB_16.5\OpenAccess\bin\win32\opt 
PATHEXT=.COM;.EXE;.BAT;.PL;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.VBS 
PCB_LIBRARY=16 
PERL5SHELL=cmd 
PHPRC=C:\Program Files\PHP\ 
PROCESSOR_ARCHITECTURE=x86 
PROCESSOR_IDENTIFIER=x86 Family 6 Model 29 Stepping 1, GenuineIntel 
PROCESSOR_LEVEL=6 
PROCESSOR_REVISION=1d01 
ProgramFiles=C:\Program Files 
PROMPT=$P$G 
PULLUP_DIFF_PAIRS=TRUE 
SESSIONNAME=RDP-Tcp#1 
SystemDrive=C: 
SystemRoot=C:\WINDOWS 
TZ=EST5EDT 
VISUALSVN_SERVER=C:\Program Files\VisualSVN Server\ 
WF_RESOURCES=Z:\oracle\ora92\WF\RES\WFus.RES 
windir=C:\WINDOWS 
+0

不知道這是多麼相關,但它可能是一個權限錯誤?運行腳本的用戶沒有必要的權限來運行系統命令?只是一個想法。 –

+0

用戶位於本地Administrators組中,該計劃任務已運行多年的同一用戶。 – jimtut

+2

也許這個問題更適合於ServerFault或SuperUser? – TLP

回答

9

原來的這種怪異行爲的原因是錯誤地定義PERL5SHELL變量:cmd.exe(在Windows命令解釋程序)應該與一些參數進行適當的處​​理被稱爲 - 有些更新後參數丟失了。)

順便說一下,在The Doc中,如果PERL5SHELL環境變量根本沒有定義,那麼Perl通常假定'cmd.exe/x/c'行作爲shell可執行文件。

P.S.我非常喜歡這個主題:它清楚地表明瞭評論的目的。 )

+0

再次感謝您的幫助!我只定義了這個var,因爲一個新的Perl腳本(foswiki)抱怨它沒有被定義。我希望我知道這會造成這麼多麻煩...... – jimtut

+1

+1我很高興它證明與定義shell的環境變量有關。 –

+0

謝謝,順便說一句,您也應該記住:您首先提到環境是問題的可能來源。 – raina77ow

相關問題