一個小小的請求:我每天都會閱讀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
不知道這是多麼相關,但它可能是一個權限錯誤?運行腳本的用戶沒有必要的權限來運行系統命令?只是一個想法。 –
用戶位於本地Administrators組中,該計劃任務已運行多年的同一用戶。 – jimtut
也許這個問題更適合於ServerFault或SuperUser? – TLP