Я нашел способ сделать это, а также делаю это для интерфейса 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.