Запись операторов журнала в стандартный вывод с помощью Matlab

matlab command-line batch-file

4575 просмотра

8 ответа

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

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

Как мы можем записать log-операторы в стандартный вывод, пока запущен matlab?

РЕДАКТИРОВАТЬ: мы запускаем Matlab 2010b на Windows

Автор: ChrisK Источник Размещён: 12.11.2019 09:06

Ответы (8)


4 плюса

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

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

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

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

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

Автор: Aabaz Размещён: 10.10.2011 03:19

2 плюса

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

Автор: eykanal Размещён: 10.10.2011 03:15

2 плюса

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

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

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

НЕ

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

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

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

Автор: chappjc Размещён: 24.01.2017 01:51

1 плюс

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

Основная идея заключается в том, что вы будете использовать команду diary, а затем хвост -f файла, но вам нужен умный способ убить команду tail, если вы откроете несколько экземпляров 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, я не думаю, автоматически помещает их в путь)

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.

Автор: user2188193 Размещён: 19.03.2013 09:04

1 плюс

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

"C:\path\to\matlab.exe" "-r" "functionToRun" "-logfile" "%JENKINS_HOME%\jobs\%JOB_NAME%\builds\%BUILD_NUMBER%\log" /wait
Автор: Andy Campbell Размещён: 28.11.2016 02:45

0 плюса

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

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

Автор: Austin Размещён: 10.10.2011 03:17

0 плюса

Решение

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

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

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

Автор: ChrisK Размещён: 14.10.2011 02:28

0 плюса

Или попробуйте использовать опцию -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
Автор: Daniel Vikström Размещён: 18.11.2014 08:15
Вопросы из категории :
32x32