Matlab

2011-10-10 14 views
7

के साथ मानक आउटपुट में लॉग स्टेटमेंट लिखना हम Jenkins buildserver से मैटलैब शुरू कर रहे हैं। चूंकि निर्माण में कुछ समय लग सकता है, इसलिए मैटलैब चल रहा है, जबकि कुछ लॉग-आउटपुट प्राप्त करना अच्छा लगेगा। मानक आउटपुट में पाठ मुद्रित करने का कोई तरीका है? disp, fprintf और java.lang.System.out.printline केवल मानक आउटपुट के लिए नहीं, matlab कंसोल को लिखें।Matlab

Using a logfile या एक पाइप मदद नहीं करेगा, क्योंकि जेनकिंस केवल एक बिल्ड चरण के दौरान मानक आउटपुट से पढ़ता है।

मैटलैब चलते समय मानक आउटपुट में लॉग-स्टेटमेंट कैसे लिख सकते हैं?

संपादित करें: हम विंडोज

पर मैटलैब 2010b चला रहे हैं
+0

यहां चर्चा के समान: http://stackoverflow.com/questions/37830871/how-to-get-matlab-output-in-jenkins-console –

उत्तर

0

मुझे एक वास्तविक समाधान नहीं मिला। गणित ने कुछ रैपर टूल बनाया। लेकिन यह matlab बाहर निकलने के बाद परिणाम केवल आउटपुट होगा। निष्पादन के दौरान आपको कोई आउटपुट नहीं मिलेगा।

http://www.mathworks.de/support/solutions/en/data/1-ACT3YN/index.html?product=ML&solution=1-ACT3YN

तो मैं जीना असली लिव-उत्पादन के बिना होगा ...

2

वहाँ MATLAB के भीतर से यह करने के लिए किसी भी अच्छे तरीके होने के लिए नहीं है। ऐसा करने का सबसे आसान तरीका मैं एक शेल स्क्रिप्ट का उपयोग कर सकता हूं। आप एक छोटी शेल स्क्रिप्ट लिख सकते हैं जो कि किसी भी इनपुट को stdout पर प्रिंट करेगा, और उसके बाद उस शेल स्क्रिप्ट को unix (या system) आदेशों का उपयोग करके matlab के भीतर से कॉल करें। जेनकींस स्क्रिप्ट के कमांड लाइन आउटपुट को पढ़ने में सक्षम होना चाहिए और इसके साथ काम करना चाहिए।

+0

विंडोज़ में नामित पाइप फ़ाइलें नहीं हैं लेकिन सॉकेट की तरह हैं। – ChrisK

0

आप डायरी मोड का उपयोग कर सकते हैं। सुनिश्चित नहीं है कि यह आपके विशिष्ट कार्यान्वयन में फिट होगा या नहीं।

http://www.mathworks.com/help/techdoc/ref/diary.html

+0

यह केवल एक फ़ाइल को लिख देगा और stdout नहीं। यह eykanal के समाधान के साथ संयोजन में काम कर सकता है ... – ChrisK

4

निर्भर करता है कि आप क्या Matlab के साथ कर रहे हैं तो आप शायद जीयूआई बिना आदेश पंक्ति में इसे लॉन्च कर सकता है। मैंने इसे सर्वर पर इस्तेमाल किया और यह एक शेल स्क्रिप्ट की तरह बहुत व्यवहार करता है और मानकों के आउटपुट को लिखता है।

startup options देखें।

/path/to/matlab -nojvm -nodisplay -nosplash -nodesktop -r /path/to/mfile 

संपादित:

मैं निम्नलिखित इस्तेमाल किया एक बहुत ही महत्वपूर्ण थोड़ा विस्तार का उल्लेख, अपने mfile के अंत में एक exit आदेश जगह या मैटलैब वहाँ इंतजार कर रखती हूँ भूल गया।

+0

AFAIK, MATLAB कंसोल विंडो को मानक आउटपुट मानता है, इसलिए मुझे लगता है कि यह आपका सबसे अच्छा विकल्प है। – Nzbuu

+0

यदि आप gui-less कंसोल-आधारित MATLAB उदाहरण के साथ काम करने में सक्षम हैं, तो यह एक अच्छा जवाब है। – eykanal

+3

विंडोज पर काम नहीं करता है। मुझे अभी भी एक matlab कमांड विंडो मिल जाएगी। http://www.mathworks.de/help/techdoc/ref/matlabwindows.html – ChrisK

1

मैं यह करने के लिए एक तरीका खोज निकाला है और यह भी खिड़कियों पर जेनकींस मैटलैब इंटरफेस के लिए यह कर रहा हूं।

मूल विचार यह है कि आप डायरी कमांड का उपयोग करेंगे, लेकिन तब फ़ाइल को पूंछ लेंगे, लेकिन यदि आप एकाधिक मैटलैब उदाहरण खोलते हैं तो आपको पूंछ कमांड को मारने के लिए एक स्मार्ट तरीका चाहिए क्योंकि नाम टकराव होंगे। तो जिस विधि का मैं उपयोग कर रहा हूं वह फ़ाइल log.txt नाम देना है जहां पीआईडी ​​का उपयोग किया जाता है MATLAB का पीआईडी ​​यह खुलता है जब यह खुलता है।

MATLAB में एक अनियंत्रित सुविधा है जो आपको इसकी पीआईडी ​​प्राप्त करने की अनुमति देती है। तो अब, आपकी बैच फ़ाइल और MATLAB दोनों को एक यादृच्छिक पाठ फ़ाइल को पढ़ने/लिखने के बिना पीआईडी ​​पता है जो कई नौकरियों को निष्पादित करते समय गन्दा हो जाएगा। तो पीआईडी ​​आप इसे अपने अद्वितीय पहचानकर्ता के रूप में उपयोग करते हैं।बैच फ़ाइल को मरने के लिए tail -f को मारने के लिए "tail -f" का पीआईडी ​​भी उपयोग किया जाता है और प्रक्रिया आमंत्रण से जुड़े कमांडलाइन विवरण का उपयोग करके MATLAB द्वारा पाया जाता है क्योंकि यह फिर से अद्वितीय पीआईडी ​​लॉग फ़ाइल नाम का उपयोग करता है।

यह कुछ wmic आदेशों का उपयोग करता है और Windows Vista/7 या इससे ऊपर की आवश्यकता है। एक्सपी के साथ आपको प्रक्रिया आईडी प्राप्त करने के लिए शायद कड़ी मेहनत करनी पड़ेगी लेकिन अभी भी संभव होनी चाहिए।

1) खिड़कियों के लिए जीएनयू awk प्राप्त करें:: http://gnuwin32.sourceforge.net/packages/gawk.htm

2) विंडोज़ संसाधन किट से tail.exe प्राप्त करें: http://www.microsoft.com/en-us/download/details.aspx?id=17657

3) यकीन है कि पूंछ और awk बनाओ

यहाँ क्या करना है आपके पथ में हैं (विंडोज़ resourece किट मुझे नहीं लगता कि स्वचालित रूप से उन्हें पथ में डालता है)

3) matlabrun.bat नामक एक बैच फ़ाइल बनाएं, (नोट: आपको @echo off की आवश्यकता है, साथ ही पूरा आदेश है काफी लंबे समय से है, सही स्क्रॉल ..)

@echo off 
wmic process call create "c:\matlab\bin\win64\matlab.exe -r \"cd('c:\jenkins\workspace\test'); workdir=pwd; outpath=[pwd '\output'] ; try; run('C:\MATLAB\work\test_run'); end; quit; \" " | findstr ProcessId | awk "{print $3}" | awk -F";" "{ print $1 }" 

4) एक और बैच run.bat बुलाया फ़ाइल के साथ बनाएँ:

for /f %%i in ('matlabrun.bat') do (

echo MATLAB Log... > log%%i.txt 

tail -f log%%i.txt 

set logfilename=log%%i.txt 

goto next 

) 

:next 

del /f %logfilename% 

5) run.bat फ़ाइल matlabrun.bat और रुको के बाद से निष्पादित करेंगे पारित नहीं किया गया है, matlab तुरंत कमांड लाइन पर वापस आ जाएगा और tail -f कमांड निष्पादित करेगा। इससे बैच फ़ाइल को तब तक पूरा करने से रोक दिया जाएगा जब तक आप इसे मार नहीं देते। matlabrun.bat matlab के पीआईडी ​​देता है।

6) एक और महत्वपूर्ण नोट: चूंकि आप "wmic process create" का उपयोग कर रहे हैं, जो आपको एक पीआईडी ​​प्रदान करेगा जो MATLAB उपयोग कर रहा है, लेकिन c: \ windows \ system32 की कार्यशील निर्देशिका में डिफ़ॉल्ट होगा। इसलिए मैं मैटलैब में कार्य निर्देशिका पास करता हूं। wmic प्रक्रिया बनाने के लिए मैटलैब चलाने के लिए आपके कमांड स्ट्रिंग में दिए गए पैरामीटर के बारे में भी कुछ खास बात है। तो ऐसा लगता है कि आपके कमांड स्ट्रिंग में अल्पविरामों का उपयोग करने में समस्या है। तो मेरा सुझाव है कि उन लोगों का उपयोग न करें, या उन्हें कैसे बचें, यह पता लगाएं (यह हो सकता है कि ^, काम करता है, लेकिन मैंने अपने मैटलैब रन कमांड में वैसे भी अपने कॉमा को हटा दिया)।

6) "test_run.m" फ़ाइल में सही लॉग फ़ाइल को लिखने और सही पूंछ-एफ उदाहरण को मारने के लिए निम्न कोड शामिल है।

matlabpid=feature('getpid'); 
filename=['log',num2str(matlabpid),'.txt']; 
filenamefull=[workdir,'\',filename]; 

diary(filenamefull); 
disp('Script starting...') 


%%% put your code here %%% 


disp('Script completed...'); 
diary off; 

%%% FIND PID of tail.exe and kill it 
%%% by using the name of the log file in the process command line 
[a,b]=dos(['wmic process get Commandline,ProcessId']); 
C=textscan(b,'%s','delimiter','\n');C=C{1}; 
for jj=1:size(C,1), 
    if strfind(C{jj},filename), 
     D=textscan(C{jj},'%s');D=D{1}; 
     dos(['taskkill /f /pid ',D{4}]) %kills tail.exe which is the log watcher 
     break 
    end 
end 

7) आप इसे run.bat करके शुरू करते हैं। यह मैटलैब को चलाएगा और निष्पादित करेगा, फिर आउटपुट को शुरू करना शुरू करें जबकि MATLAB रीयल-टाइम में चलता है। फिर जब यह किया जाता है तो यह लॉग फ़ाइल को हटा देगा।

8) मेरे निर्देशिका संरचना/फ़ाइलें (मैं Win7 64 बिट का उपयोग कर रहा) इन स्थानों में हैं:

c: \ जेनकींस \ कार्यक्षेत्र \ परीक्षण \ tail.exe

c: \ जेनकींस \ कार्यक्षेत्र \ test \ awk.exe

c: \ जेनकींस \ कार्यक्षेत्र \ परीक्षण \ matlabrun.bat

c: \ जेनकींस \ कार्यक्षेत्र \ परीक्षण \ run.bat

c: \ matlab \ काम \ test_run एमएम

c: \ matlab \ बिन \ win64 \ matlab.exe

आप 32 बिट matlab, बिंदु यह Win32 निर्देशिका के लिए उपयोग कर रहे हैं।सही पीआईडी ​​प्राप्त करने के लिए, आपको win32 या win64 निर्देशिका में वास्तविक matlab.exe बाइनरी निर्दिष्ट करने की आवश्यकता है।

0

या matlab में '-logfile' विकल्प का उपयोग करने का प्रयास करें।

matlab.exe -nodisplay -nosplash -nodesktop -wait -logfile logfile.txt -r "try script.m ;catch err; disp(err.message); end ; exit" 

मैं पार्टी (खोल निष्पादित करें) जेनकींस में उपयोग करते हुए, तो तुम पूंछ लॉग फ़ाइल जबकि matlab चल रहा है कर सकते हैं पसंद करते हैं।

matlab.exe <...> & 
matpid=$! 
tail -f logfile.txt & 
tailpid=$! 
wait $matpid 
matexit=$? 
kill $tailpid 
sleep 1 # Just to make sure kill is done before Jenkins step ends and no zombie processes 
exit $matexit 
1

आप जेनकिन्स लॉग फ़ाइल में -logfile विकल्प को इंगित करके ऐसा कर सकते हैं। निम्नलिखित की तरह कुछ:

"C:\path\to\matlab.exe" "-r" "functionToRun" "-logfile" "%JENKINS_HOME%\jobs\%JOB_NAME%\builds\%BUILD_NUMBER%\log" /wait 
2

ऐसा लगता है कि -wait और -log (नहीं -logfile) माता-पिता कंसोल के लिए stdout क्लोन कमांड विंडो उत्पादन, लेकिन केवल का संयोजन करता है, तो आप में MATLAB निष्पादन फोन [ MATLABROOT] \ bin, नहीं [MATLABROOT] \ bin \ win64 (वर्तमान आर्क के लिए उपनिर्देशिका)।

R2015b और R2016b के साथ विंडोज पर परीक्षण किया गया:

C:\MATLAB\bin\matlab.exe -wait -log 

नहीं

 
C:\MATLAB\win64\bin\matlab.exe -wait -log 

अपनी स्क्रिप्ट में एक exit/quit डाल करने के लिए यदि आप -r साथ चल रहे हैं याद रखें।

एकमात्र समस्या यह है कि मुझे -log विकल्प के लिए कोई प्रलेखन नहीं मिल रहा है! भावहीन।

+0

➕1 महान खोज, यह दस्तावेज क्यों नहीं है! मैंने बस इसे R2017a में आजमाया और यह बहुत अच्छा काम करता है। वास्तव में आप इसे इंटरैक्टिव मोड में उपयोग कर सकते हैं। तो यदि आप 'matlab.exe -wait -log' के साथ MATLAB प्रारंभ करते हैं, और एक एमएक्स फ़ाइल बनाते हैं जो' std :: cout' का उपयोग करता है, तो आप वास्तव में टर्मिनल में अपना आउटपुट देख सकते हैं (जो MATLAB में दिखाई नहीं देता है कमांड विंडो)। – Amro