2012-06-18 39 views
11

Một yêu cầu nhỏ: Tôi đọc câu hỏi Perl của Stack Overflow mỗi ngày và trả lời/đóng góp ở nơi tôi có thể; hôm nay tôi cần sự giúp đỡ của cộng đồng!Điều gì có thể khiến các cuộc gọi hệ thống Perl bắt đầu thất bại?

Cài đặt Perl: Tôi đang chạy Hoạt động Perl 5.8.8 trên Windows. Cài đặt này nằm trên ổ đĩa cục bộ của máy chủ bộ phận của chúng tôi, cũng được chia sẻ với mạng. Tất cả người dùng bộ phận đều chạy Perl trên máy tính của họ bằng cách trỏ tới Perl được cài đặt trên mạng này. Điều này đã làm việc trong nhiều năm và không gây ra vấn đề gì, nhưng đó là một phần thông tin cần thiết để hiểu vấn đề.

Máy chủ được đề cập cũng là máy chủ "cron" (Theo lịch tác vụ) của chúng tôi, xử lý nhiều tác vụ tự động hóa khác nhau. Đột nhiên tuần trước, các cuộc gọi hệ thống trong các kịch bản Perl (trên máy chủ) bắt đầu thất bại (chi tiết bên dưới). Lúc đầu, tôi nghi ngờ một cài đặt Perl bị hỏng, nhưng tất cả các máy tính khách vẫn có thể chạy cùng một tập lệnh Perl mà không gặp bất kỳ vấn đề nào, khiến tôi nghĩ đó là vấn đề máy chủ. Tôi đã khởi động lại máy chủ hai lần, và vấn đề là dai dẳng, vì vậy tôi cần giúp đỡ!

Dưới đây là một số ví dụ về các cách khác nhau mà các cuộc gọi hệ thống đang thất bại, luộc xuống Perl một lớp lót:

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

Điều đó sẽ in một "dir" niêm yết, nhưng thay vào đó nó sẽ mở ra một sub-vỏ . Nếu tôi gõ "exit", tôi có thể thoát khỏi sub-shell, và tôi trở lại shell gốc (xác nhận bằng cách kiểm tra lịch sử shell bằng cách sử dụng phím mũi tên LÊN).

% perl -e "print `dir`" 

Điều này thực sự bị treo. Không có gì xảy ra cả. Nếu tôi Ctrl-C để giết quá trình, tôi nhận được thông báo "Chấm dứt tín hiệu SIGINT (2)" và dấu nhắc DOS trở lại. Tuy nhiên, bất kỳ lệnh trong tương lai trong dấu nhắc DOS (thậm chí chỉ cần nhấn ENTER) gây ra lỗi "Quá trình cố gắng để viết vào một ống không tồn tại." Bạn phải thoát khỏi dấu nhắc DOS vì nó có hiệu quả vô ích.

dụ cuối:

% perl -e "system('Z:/Scripts/rebuild.pl')" 

'ebuild.pl' không được công nhận là một lệnh nội bộ hay bên ngoài, operable chương trình hay tập tin thực thi.

Trong trường hợp này, Perl chuyển các dấu gạch chéo về phía trước (/) sang DOS/Windows(), mà nó đã thực hiện tốt trong nhiều năm. Tuy nhiên, Perl đang giải thích "\ r" ở đầu tên tập tin "rebuild.pl" như một vận chuyển trả về (tôi nghĩ) và tìm kiếm "ebuild.pl" còn lại. Các cuộc gọi đến các tên kịch bản khác có các ký tự không thể được hiểu sai như kết quả trong các móc treo trên (nếu bạn sử dụng các dấu sau) của các hệ vỏ con đang được mở (đối với các cuộc gọi hệ thống()).

Tôi không chỉ bối rối bởi điều này - tôi tuyệt vọng! Công việc "cron" của máy chủ bộ phận của chúng tôi là vô dụng ngay bây giờ vì chúng tôi sử dụng rất nhiều cuộc gọi hệ thống.

Một lần nữa, tôi không nghĩ đây là một cài đặt Perl bị hỏng, vì người dùng mạng có thể chạy tốt. Vì vậy, những gì có thể xảy ra trên một máy tính cá nhân (không gắn liền với bản cài đặt Perl) có thể khiến các cuộc gọi hệ thống của Perl thất bại như thế này?

thiết lập môi trường, theo yêu cầu:

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

Bạn không chắc chắn mức độ liên quan của vấn đề này, nhưng đó có phải là lỗi quyền không? Người dùng chạy tập lệnh không có quyền cần thiết để chạy các lệnh hệ thống? Chỉ là một ý nghĩ. –

+0

Người dùng nằm trong nhóm Quản trị viên cục bộ, cùng một người dùng theo đó Tác vụ theo lịch đã chạy trong nhiều năm. – jimtut

+2

Có lẽ câu hỏi này phù hợp hơn với ServerFault hoặc SuperUser? – TLP

Trả lời

9

Hóa ra lý do của hành vi kỳ lạ này đã không đúng quy định PERL5SHELL biến: cmd.exe (người phiên dịch vỏ trong Windows) nên được gọi với một số thông số cho việc xử lý thích hợp - có thông số bị mất sau một số cập nhật.Bằng cách này, trong The Doc nó nói rằng Perl thường giả định dòng 'cmd.exe/x/c' như là một shell thực thi anyway nếu biến môi trường PERL5SHELL không được xác định ở tất cả.

P.S. Tôi thực sự thích chủ đề này: nó rõ ràng cho thấy mục đích của ý kiến.)

+0

Cảm ơn bạn một lần nữa vì đã giúp đỡ! Tôi chỉ xác định rằng var vì một kịch bản Perl mới (foswiki) đã phàn nàn rằng nó không được xác định. Tôi ước tôi biết nó sẽ gây ra nhiều rắc rối này ... – jimtut

+1

+1 Tôi vui mừng vì nó hóa ra có liên quan đến một biến môi trường định nghĩa một trình bao. –

+0

Cảm ơn bạn, và bằng cách này, bạn cũng nên được ghi nhận: bạn đã đề cập đến môi trường như một nguồn có thể của vấn đề. – raina77ow

Các vấn đề liên quan