Запись операторов журнала в стандартный вывод с помощью Matlab - PullRequest
8 голосов
/ 10 октября 2011

Мы запускаем Matlab с нашего сервера сборки Jenkins .Поскольку сборка может занять некоторое время, было бы неплохо получить некоторые выходные данные журнала во время работы matlab.Есть ли способ напечатать текст на стандартный вывод?disp, fprintf и java.lang.System.out.printline пишут только в консоль matlab, а не в стандартный вывод.

Использование файла журнала или канала не поможет, поскольку Дженкинстолько чтение из стандартного вывода во время шага сборки.

Как мы можем записывать лог-операторы в стандартный вывод во время работы matlab?

РЕДАКТИРОВАТЬ: Мыпод управлением Matlab 2010b на Windows

Ответы [ 8 ]

4 голосов
/ 10 октября 2011

В зависимости от того, что вы делаете с Matlab, вы можете запустить его в командной строке без графического интерфейса. Я использовал это на сервере, и он ведет себя как сценарий оболочки и записывает в стандартный вывод.

См. параметры запуска .

Я использовал следующее:

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

РЕДАКТИРОВАТЬ : забыл упомянуть одну очень важную маленькую деталь, поместите команду exit в конце вашего mfile, иначе Matlab будет ждать там.

2 голосов
/ 24 января 2017

Кажется, что комбинация -wait и -log (не -logfile) клонирует вывод командного окна в стандартный вывод родительской консоли, но только , если вы вызываете исполняемый файл MATLAB в [MATLABROOT] \ bin, а не в [MATLABROOT] \ bin \ win64 (подкаталог для текущей арки).

Протестировано на Windows с R2015b и R2016b:

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

НЕ

C:\MATLAB\win64\<b>bin\</b>matlab.exe -wait -log

Не забудьте добавить exit / quit в ваш скрипт, если вы работаете с -r.

Единственная проблема в том, что я не могу найти какую-либо документацию для опции -log! Мех.

2 голосов
/ 10 октября 2011

Кажется, нет хороших способов сделать это из MATLAB. Самый простой способ сделать это - использовать скрипт оболочки. Вы можете написать небольшой скрипт оболочки, который будет просто печатать любой ввод в stdout, а затем вызывать этот скрипт оболочки из matlab, используя команды unix (или system). Дженкинс должен быть в состоянии прочитать вывод сценария из командной строки и работать с ним.

1 голос
/ 28 ноября 2016

Вы можете сделать это, указав опцию -logfile в файле журнала Jenkins.Примерно так:

"C:\path\to\matlab.exe" "-r" "functionToRun" "-logfile" "%JENKINS_HOME%\jobs\%JOB_NAME%\builds\%BUILD_NUMBER%\log" /wait
1 голос
/ 20 марта 2013

Я нашел способ сделать это, а также делаю это для интерфейса Jenkins Matlab в Windows.

Основная идея состоит в том, что вы будете использовать команду дневника, а затем хвост -f файла, но вам нужен умный способ убить команду хвоста, если вы откроете несколько экземпляров matlab, потому что будут конфликты имен. Таким образом, метод, который я использую, состоит в том, чтобы назвать файл log.txt, где используемый PID - это PID MATLAB, который он использует при открытии.

В MATLAB есть недокументированная функция, которая позволяет вам получить его PID. Итак, теперь и ваш пакетный файл, и MATLAB знают PID без необходимости чтения / записи в произвольный текстовый файл, который будет запутываться при выполнении нескольких заданий. Таким образом, PID, который вы используете в качестве уникального идентификатора. PID "tail -f" также используется MATLAB для уничтожения tail -f, чтобы заставить пакетный файл умереть, и определяется MATLAB с использованием деталей командной строки, связанных с вызовом процесса, поскольку он снова использует уникальное имя файла журнала PID.

Для этого используются некоторые команды wmic и требуется Windows Vista / 7 или выше. С XP вам, вероятно, придется больше работать, чтобы получить идентификаторы процесса, но это все еще возможно.

Вот что нужно сделать:

1) Получить GNU AWK для Windows: http://gnuwin32.sourceforge.net/packages/gawk.htm

2) Получить файл tail.exe из набора ресурсов Windows: http://www.microsoft.com/en-us/download/details.aspx?id=17657

3) Убедитесь, что tail и awk находятся на вашем пути (Windows Resourece Kit, я не думаю, автоматически помещает их в путь)

3) Создайте командный файл с именем matlabrun.bat следующим образом (примечание: вам нужно отключить @echo, также вся команда довольно длинная, выполните прокрутку вправо ..)

@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, и поскольку -wait не передается, matlab немедленно вернется в командную строку и выполнит команду tail -f. Это заблокирует пакетный файл от завершения, пока вы не убьете его. matlabrun.bat возвращает PID для matlab.

6) Еще одно важное замечание: поскольку вы используете "wmic process create", который предоставит вам PID, который использует MATLAB, но по умолчанию будет рабочим каталогом c: \ windows \ system32. Вот почему я передаю рабочий каталог в Matlab. wmic process create также немного говорит о том, какие параметры вы вводите в свою командную строку для запуска matlab. Так что, похоже, есть проблема с использованием запятых в командной строке. Поэтому я предлагаю не использовать их или выяснить, как их избежать (возможно, это ^ работает), но я все равно удалил запятые в моей команде запуска matlab).

6) Файл «test_run.m» содержит следующий код для записи в правильный файл журнала и для уничтожения правильного экземпляра tail -f.

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, а затем начнет вывод результатов, пока MATLAB работает в режиме реального времени. Затем по окончании будет удален файл журнала.

8) Моя структура каталогов / файлы находятся в этих местах (я использую win7 64bit):

C: \ Дженкинс \ рабочее место \ тест \ tail.exe

C: \ Дженкинс \ рабочее место \ тест \ awk.exe

C: \ Дженкинс \ рабочее место \ тест \ matlabrun.bat

C: \ Дженкинс \ рабочее место \ тест \ run.bat

C: \ MATLAB \ работа \ test_run.m

C: \ MATLAB \ Bin \ win64 \ matlab.exe

Если вы используете 32-битный Matlab, укажите его в каталоге win32. Чтобы получить правильный PID, вам нужно указать файл собственно matlab.exe в каталоге win32 или win64.

0 голосов
/ 18 ноября 2014

Или попробуйте использовать опцию '-logfile' в matlab.

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

Я предпочитаю использовать bash (Execute shell) в Jenkins, тогда вы можете подключить файл журнала во время работы 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
0 голосов
/ 14 октября 2011

Я не нашел реального решения.Mathworks создал некоторый инструмент-обертку.Но это будет выводить результаты только после выхода из Matlab.Вы не получите никакого вывода во время выполнения.

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

Так что я буду жить без реального живого вывода ...

0 голосов
/ 10 октября 2011

Вы можете использовать режим дневника. Не уверен, что он подойдет для вашей конкретной реализации.

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

...