Короткая история: ваш скрипт вызывает exit ()? Вы используете "-wait"?
Длинная история: я думаю, что вам в принципе не повезло, если вы хотите с ним взаимодействовать, но это должно сработать, если вы просто хотите сгруппировать задания. Matlab в Windows - это приложение с графическим интерфейсом, а не консольное приложение, и оно не будет взаимодействовать только с символьным удаленным подключением. Но вы все равно можете запустить процесс. Matlab на самом деле отобразит графический интерфейс - он будет просто на сеансе рабочего стола на удаленном компьютере, к которому у вас нет доступа. Но если вы можете заставить его выполнять свою работу без дополнительного вклада, это можно заставить работать, для некоторого значения «работа».
Ваш переключатель "-r script" - верное направление. Но поймите, что в Windows поведение «-r» в Matlab заключается в завершении сценария и возвращении в графический интерфейс, ожидая дальнейшего ввода. Вам необходимо явно включить вызов exit (), чтобы завершить работу, и добавить try / catches, чтобы убедиться, что exit () достигнут. Кроме того, вы должны использовать ключ «-logfile», чтобы записать копию всех выходных данных командного окна в файл журнала, чтобы вы могли видеть, что он делает (так как вы не можете видеть графический интерфейс), и иметь запись предыдущих запусков.
Кроме того, matlab.exe по умолчанию является асинхронным. Ваш ssh вызов запустит Matlab и вернется сразу же, если вы не добавите ключ "-wait". Проверьте процессы на машине, на которой вы работаете; Matlab на самом деле может быть запущен. Добавьте -wait, если хотите, чтобы он блокировался до завершения.
Один из способов сделать это - просто использовать -r для вызова стандартного сценария оболочки задания, который инициализирует ваши библиотеки и пути, запускает задание, выполняет очистку и выход. Вы также захотите создать оболочку .bat, которая устанавливает переключатель -logfile, чтобы он указывал на файл с именем задания, отметкой времени и другой информацией. Примерно так на уровне М-кода.
function run_batch_job(jobname)
try
init_my_matlab_library(); % By calling classpath(), javaclasspath(), etc
feval(jobname); % assumes jobname is an M-file on the path
catch err
warning('Error occurred while running job %s: %s', jobname, err.message)
end
try
exit();
catch err
% Yes, exit() can throw errors
java.lang.System.exit(1); % Scuttle the process hard to make sure job finishes
end
% If your code makes it to here, your job will hang
Я настраивал системы пакетных заданий, используя этот стиль в Windows Scheduler, Tidal и TWS. Я думаю, что он должен работать так же, как с помощью SSH или другого удаленного доступа.
Пакетная система Matlab в Windows, подобная этой, хрупка и сложна в управлении. Matlab на Windows принципиально не создан, чтобы быть системой безголового пакетного выполнения; предположения об интерактивном графическом интерфейсе распространены в нем и трудны для обхода. Низкоуровневые ошибки или лицензионные ошибки вызовут модальные диалоговые окна и повесят вашу работу. Последовательность запуска Matlab, похоже, имеет гоночные условия. Вы не можете установить статус выхода MATLAB.exe. Нет никакого способа получить в Matlab GUI для отладки ошибок, которые выдает работа. Файл журнала может быть буферизован, и вы теряете вывод из-за зависаний и сбоев. И так далее.
Серьезно подумайте о портировании на Linux. Matlab гораздо более подходит в качестве системы периодического действия.
Если у вас есть деньги или запасные лицензии, вы также можете использовать набор инструментов и сервер распределенных вычислений Matlab для запуска кода на удаленных рабочих узлах. Это может работать для распараллеливания или для удаленных пакетных заданий.