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
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ĩ. –
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
Có lẽ câu hỏi này phù hợp hơn với ServerFault hoặc SuperUser? – TLP