繁体   English   中英

在Mac OS X上启动Matlab的后台实例

[英]Starting a Background Instance of Matlab on Mac OS X

在Windows中,您可以在Matlab中使用以下命令来启动一个新的MATLAB实例,该实例将在后台运行(即,您可以在第一个MATLAB版本中继续执行命令)。

系统('matlab&')

OSX中的类似调用

系统([matlabroot'/ bin / matlab&'])

但是会导致显示初始图像,然后什么也不显示。 如果我取出与号,则新实例将按预期方式打开。 不幸的是,这对我不起作用,我确实需要能够在第二个MATLAB运行时控制它的第一个实例。

有谁知道为什么操作系统之间存在这种差异? 顺便说一句,我在Mac上使用OSX 10.7,Windows 7 64位,在PC上使用MATLAB R2012a,在PC上使用R2012b。

作为某些背景知识,我正在尝试为交互式命令行界面编写一个通用的测试器,该界面广泛使用input()函数。

编辑:我应该提到该命令

/Applications/MATLAB_R2012a.app/bin/matlab和

可以从OSX终端正常工作。 换句话说,将打开MATLAB的新实例,并且可以在终端中输入新命令。 因此,此问题似乎特定于OSX matlab中的system()函数。

另外,我尝试将该命令添加到bash脚本中并从matlab调用该脚本,但是与将命令放入system()函数时遇到的问题相同。

谢谢

这是一个长期的尝试,但是可能会发生,因为当您在Unix或OS X上使用system()命令从Matlab调用Matlab的新实例时, matlab_helper进程会派生并运行一个Shell进程来运行新应用程序。 如果您省略了&符,shell将阻塞并等待程序完成,而system()等待它,因此第一个Matlab会锁定。 并且(这是推测部分),如果添加与号,Matlab将在后台启动,然后分叉的shell退出,这将导致新的Matlab进程退出,因为其父进程(shell)已退出。 (Windows没有相同的父/子进程关系,进程启动机制或外壳程序,这将解释不同的行为。)

您可以尝试在命令前面加上nohup ,以防止进程被SIGHUP杀死,这可能是第二个Matlab进程正在发生的情况。

system(['nohup ' matlabroot '/bin/matlab &'])

您也可以尝试使用OS X open命令启动新的独立实例。 这样的事情。 您可能需要弄乱选项和路径,但是-n应该为您提供了一个新实例。 它应该指向/Applications/MATLAB_R2012a.app ; 我假设这就是matlabroot在OS X上返回的内容。

system(['open -na ' matlabroot])

您还可以尝试从Matlab内的Java流程启动功能system()而不是system()运行它。 Runtime.exec()不阻挡像system()那样,并且可以存在其它的怪癖到system()matlab_helper架构。 尝试从Matlab使用java.lang.Runtime启动它。

jrt = java.lang.Runtime.getRuntime();
newMatlabProcess = jrt.exec([matlabroot '/bin/matlab']);

您也可以使用此机制尝试上述其他命令行变体,并且可能需要将stdout重定向到/ dev / null,因为新进程的输入和输出被缓冲到该newMatlabProcess对象中。

您可以使用applescript来执行此操作。 我做这样的事情:

! osascript -e "tell application \"Terminal\" to do script \"cd `pwd`;matlab -nojvm -nosplash -r 'why'\""

本示例在当前目录中打开一个新的Matlab实例,并运行命令“ why”。 如果您在后台Matlab进程中需要Java,则可以删除“ -nojvm”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM