2012-06-18 52 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

相关问题