一个小小的请求:我每天都会阅读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