小さなリクエスト: 私は毎日 Stack Overflow の Perl の質問を読み、できる限り回答/貢献しています。今日、私はコミュニティの助けが必要です!
Perl のセットアップ: Windows で Active Perl 5.8.8 を実行しています。インストールは、ネットワークで共有されている部門サーバーのローカル ドライブに行われます。すべての部門ユーザーは、ネットワークにインストールされたこの Perl を指定して、自分の PC で Perl を実行します。これは何年も機能しており、問題を引き起こしていませんが、問題を理解するために必要な情報です。
問題のサーバーは、さまざまな自動化タスクを処理する「cron」(スケジュールされたタスク) サーバーでもあります。先週突然、(サーバー上の) Perl スクリプトのシステム コールが失敗し始めました (詳細は後述)。最初は、Perl のインストールが破損しているのではないかと疑っていましたが、すべてのクライアント PC で問題なく同じ Perl スクリプトを実行できるため、サーバーの問題であると考えました。サーバーを 2 回再起動しましたが、問題が解決しないため、助けが必要です。
以下は、システム コールが失敗するさまざまな方法の例で、Perl のワンライナーに要約されます。
% perl -e "system('dir')"
それは「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" を探しています。そのように文字が誤って解釈されない他のスクリプト名を呼び出すと、(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