【问题标题】:Starting a Background Instance of Matlab on Mac OS X在 Mac OS X 上启动 Matlab 的后台实例
【发布时间】:2013-03-13 22:10:37
【问题描述】:

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

system('matlab &')

OSX 中的类似调用,

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

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

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

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

编辑:我应该提到该命令

/Applications/MATLAB_R2012a.app/bin/matlab &

在 OSX 终端上按预期工作。换句话说,一个新的 MATLAB 实例打开并且可以在终端中输入新的命令。所以这个问题似乎特定于 OSX matlab 中的 system() 函数。

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

谢谢

【问题讨论】:

  • 有-nosplash 命令行选项matlab.exe - 也许这就是你要找的?
  • 问题不是在Mac上显示闪屏,而是在闪屏后第二个MATLAB实例打不开。
  • 是的,但是您是否尝试过使用-nosplash 并且没有终止&?我相信这会做你想要的。我不知道为什么& 符号在 OSX 上的行为不同。
  • 我在 OSX 上用 -nosplash 用 & 号尝试了它,正如你所料,什么都没有发生(没有启动屏幕,没有 matlab 的新实例)。我在没有与号的情况下尝试过,新实例打开,但第一个实例无法执行命令。不幸的是,这是不可接受的。
  • 试试没有符号。当然,这是假设您希望显示命令窗口(您的问题似乎表明了这一点)。

标签: macos bash matlab operating-system


【解决方案1】:

这是一个长镜头,但它可能会发生,因为当您在 Unix 或 OS X 上使用 system() 命令从 Matlab 调用新的 Matlab 实例时,matlab_helper 进程分叉并运行一个 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 中的 Java 进程启动功能运行它,而不是使用 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 对象中。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 2017-02-24
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2014-12-24
      • 2014-07-24
      相关资源
      最近更新 更多