2013-03-24 169 views
1

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

系统( 'MATLAB &')

在OSX的类似呼叫,

系统([matlabroot '/斌/ MATLAB &'])

但是,结果显示的是飞溅图像,然后什么也没有。如果我删除&符号,则新实例按预期打开。不幸的是,这对我不起作用,我真的需要能够控制MATLAB的第一个实例,而第二个正在运行。

有谁知道为什么这种操作系统之间的差异存在?顺便说一下,我使用OSX 10.7,Windows 7 64位,Mac上的MATLAB R2012a和PC上的R2012b。作为一些背景知识,我试图为广泛使用input()函数的交互式命令行界面编写一个通用测试器。

编辑:我应该提到,从OSX终端命令预期要

/Applications/MATLAB_R2012a.app/bin/matlab &

作品。换句话说,MATLAB的一个新实例打开,新的命令可以输入到终端。所以这个问题似乎是特定于OSX matlab中的system()函数的。另外,我试图将该命令添加到bash脚本中,并从matlab中调用脚本,但遇到了与将该命令放入system()函数的问题相同的问题。

感谢

+0

“matlab.exe”有'-nosplash'命令行选项 - 也许这就是你要找的东西? – wakjah 2013-03-24 11:10:21

+0

问题不在于启动画面在Mac中显示,而是在启动画面之后,第二个MATLAB实例未打开。 – 2013-03-24 11:24:53

+0

是的,但是你用'-nosplash'试过并且没有终止'&'?我相信这会做你想做的。我不知道为什么'&'符号在OSX上的行为不同。 – wakjah 2013-03-24 11:27:45

回答

0

这是一个长镜头,但它可能会发生,因为当你从MATLAB调用Matlab的新实例与在Unix或OS X中,matlab_helper过程叉system()命令,并运行一个shell进程运行新的应用程序。如果你省略了&符号,shell会阻塞并等待程序结束,并且system()等待它,所以第一个Matlab会锁定。如果添加&符号,Matlab会在后台启动,然后分叉的shell退出,这会导致新的Matlab进程退出,因为它的父进程(shell)已经退出。 (Windows没有相同的父/子进程关系,进程启动机制或shell,这可以解释不同的行为。)

您可以尝试在命令前加上nohup,以防止进程被SIGHUP ,这可能是你在第二次Matlab过程中发生的事情。

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

您也可以尝试使用OS X open命令来启动一个新的独立实例。像这样的东西。您可能需要摆弄选项和路径,但-n应该是给你一个新的实例。它应该指向/Applications/MATLAB_R2012a.app;我假定这就是matlabroot是在OS X上

system(['open -na ' matlabroot]) 

您也可以尝试从内部Matlab的,而不是与system()从Java进程,启动功能运行它返回。 Runtime.exec()不会像system()那样阻止,并且可能存在system()的其他怪癖,如matlab_helper架构。尝试从Matlab中启动java.lang.Runtime。以上使用了这种机制,

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

你可以试试其他的命令行变种,您可能需要到标准输出重定向到/ dev/null,因为新流程的输入和输出到该newMatlabProcess对象中缓存。

0

您可以使用applescript来做到这一点。我做这样的事情:

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

本示例打开一个新的Matlab的情况下,在当前目录下,并运行命令“为什么”。你可以删除“-nojvm”,如果你在你的背景中需要java进程Matlab进程