什么可能导致 Perl 系统调用开始失败



一个小请求:我每天都阅读 Stack Overflow 的 Perl 问题,并在力所能及的地方回答/贡献;今天我需要社区的帮助!

Perl 设置:我在 Windows 上运行 Active Perl 5.8.8。 安装在我们部门服务器的本地驱动器上,该驱动器也与网络共享。 所有部门用户都通过指向这个网络安装的Perl在自己的PC上运行Perl。 这已经工作了多年,并没有引起问题,但这是理解问题所需的一条信息。

有问题的服务器也是我们的"cron"(计划任务)服务器,处理各种自动化任务。 上周突然,Perl脚本(在服务器上)中的系统调用开始失败(详情如下)。 起初,我怀疑Perl安装损坏,但所有客户端PC仍然可以运行相同的Perl脚本而不会出现任何问题,导致我认为这是服务器问题。 我已经重新启动了服务器两次,问题仍然存在,因此我需要帮助!

以下是系统调用失败的各种方式的一些示例,归结为 Perl 单行代码:

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

这应该打印一个"目录"列表,但它会打开一个子外壳。 如果我键入"exit",我可以退出子外壳,然后我又回到了原始外壳中(通过使用向上箭头键检查外壳历史记录来确认)。

% 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 SettingsAll Users
APPDATA=C:Documents and SettingsengmodemApplication Data
CDSROOT=Z:CadenceSPB_16.5
CDS_CONCEPT_NOSPLASH=TRUE
CDS_LIC_ONLY=1
CDS_SITE=Z:CadenceSites16.5
CHDL_LIB_INST_DIR=%CDSROOT%
CLIENTNAME=USENTUTTLJL3C
ClusterLog=C:WINDOWSClustercluster.log
CommonProgramFiles=C:Program FilesCommon Files
COMPUTERNAME=CORPUSAPP5
ComSpec=C:WINDOWSsystem32cmd.exe
CONCEPT_INST_DIR=%CDSROOT%
FP_NO_HOST_CHECK=NO
HOMEDRIVE=H:
HOMEPATH=
HOMESHARE=\PF1HOME
ICMHOME=Z:SoftwarePTCINTERC~1
INSTDIR=%CDSROOT%
LOGONSERVER=\ENGMAHO5
LSF_BINDIR=Z:SoftwareLSFbin
LSF_ENVDIR=\hwc151LSF_6.2etc
MESSAGE=BROADCAST
NUMBER_OF_PROCESSORS=2
OA_PLUGIN_PATH=%CDSROOT%ShareoaPlugIns
OS=Windows_NT
Path=C:Program FilesLegatonsrbin;Z:oracleora92bin;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Program FilesWindows Resource KitsTools;Z:SoftwarePerl5.8.8bin;C:Program FilesOraclejre1.3.1bin;C:Program FilesOraclejre1.1.8bin;C:Program FilesSupport Tools;Z:SoftwareLSFbin;C:Program FilesPHP;C:Program FilesMicrosoft SQL Server90Toolsbinn;C:Program FilesEMC RepliStor;C:GitStackpython;C:GitStackpythonScripts;C:GitStackgitcmd;Z:Scripts;Z:bin;Z:CadenceSPB_16.5toolsbin;Z:CadenceSPB_16.5toolsfetbin;Z:CadenceSPB_16.5toolspcbbin;Z:CadenceSPB_16.5OpenAccessbinwin32opt
PATHEXT=.COM;.EXE;.BAT;.PL;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.VBS
PCB_LIBRARY=16
PERL5SHELL=cmd
PHPRC=C:Program FilesPHP
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 FilesVisualSVN Server
WF_RESOURCES=Z:oracleora92WFRESWFus.RES
windir=C:WINDOWS

事实证明,这种奇怪行为的原因被错误地定义为变量PERL5SHELL:cmd.exe(Windows 中的 shell 解释器)应该使用一些参数进行调用以进行正确处理 - 一些更新后缺少参数。

顺便说一下,在 The Doc 中,如果根本没有定义环境变量PERL5SHELL Perl 通常假定 'cmd.exe/x/c' 行作为 shell 可执行文件。

附言我真的很喜欢这个线程:它清楚地显示了评论的目的。)

最新更新