短篇故事:你的脚本调用 exit() 吗?您使用“-wait”吗?
长话短说:我认为如果你想与它交互,你基本上就不走运,但如果你只想批量处理作业,这应该可行。 Windows 上的 Matlab 是 GUI 应用程序,而不是控制台应用程序,并且不会与纯字符远程连接交互。但您仍然可以启动该过程。 Matlab 实际上会显示 GUI - 它只是在您无权访问的远程计算机上的桌面会话中。但是,如果您可以让它在没有进一步输入的情况下完成您的工作,那么就可以使其发挥作用,以获得某些“工作”价值。
您的“-r script”开关是正确的方向。但要意识到,在 Windows 上,Matlab 的“-r”行为是完成脚本,然后返回到 GUI,等待进一步的输入。您需要显式地包含“exit()”调用来完成您的工作,并添加 try/catch 来确保到达 exit()。另外,您应该使用“-logfile”开关将所有命令窗口输出的副本捕获到日志文件中,以便您可以看到它正在做什么(因为您看不到 GUI)并记录之前的运行。
此外,matlab.exe 默认情况下是异步的。除非您添加“-wait”开关,否则您的 ssh 调用将启动 Matlab 并立即返回。检查您要通过 ssh 连接的计算机上的进程; Matlab 可能实际上正在运行。如果您希望它阻塞直到完成,请添加 -wait 。
执行此操作的一种方法是使用 -r 调用标准作业包装器脚本,该脚本初始化您的库和路径、运行作业以及清理和退出。您还需要创建一个 .bat 包装器,将 -logfile 开关设置为指向包含作业名称、时间戳和其他信息的文件。 M 代码级别与此类似。
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 或其他远程访问下应该以相同的方式工作。
像这样的 Windows 上的 Matlab 批处理系统很脆弱且难以管理。 Windows 上的 Matlab 从根本上来说并不是一个无头批处理执行系统;关于交互式 GUI 的假设在其中很普遍并且很难解决。低级错误或许可证错误将弹出模式对话框并挂起您的工作。 Matlab 启动序列似乎存在竞争条件。您无法设置 MATLAB.exe 的退出状态。无法使用 Matlab GUI 来调试作业抛出的错误。日志文件可能会被缓冲,并且您会在挂起和崩溃附近丢失输出。等等。
认真考虑移植到 Linux。 Matlab 更适合作为批处理系统。
如果您有钱或有多余的许可证,您还可以使用 Matlab 分布式计算工具箱和服务器在远程工作节点上运行代码。这适用于并行化或远程批处理作业。