2

我需要每天执行几个 matlab 函数。其中一些功能从互联网下载数据。例如,如果数据还没有准备好,它们就会失败,我希望它们在一段时间后重试。为了实现这一点,我有一个 python 脚本多次调用 matlab 函数直到成功,或者如果它们反复失败,请给我发送电子邮件。可能不是“最先进的”实现,但我不知道更好。守护进程每天都会调用 python 脚本。现在,如果我登录到计算机但当计算机(imac)休息一段时间时失败并返回值 1 和以下消息(守护程序错误日志)(我禁止它在节能器偏好设置中进入睡眠状态,则此方法有效。在至少我认为我是通过勾选“显示器关闭时防止计算机自动睡眠”来做到的。但是,

Traceback (most recent call last):
  File "/Users/<username>/Documents/daemontest/matlab_batcher.py", line 108, in <module>
    eng = matlab.engine.start_matlab()
  File "/Library/Python/2.7/site-packages/matlab/engine/__init__.py", line 92, in start_matlab
    eng = MatlabEngine(option)
  File "/Library/Python/2.7/site-packages/matlab/engine/matlabengine.py", line 230, in __init__
    self.__dict__["_matlab"] = pythonengine.createMATLAB(tokens)
matlab.engine.EngineError: MATLAB process can not be created.

Matlab 写了一个故障转储segmentation violation(我自己不能用它做任何事情)。

我猜计算机无论如何都会以某种方式进入睡眠状态,并且它无法启动matlab。会是这样吗?如果是这样,我该如何防止它进入睡眠状态或将其配置为唤醒以启动守护进程?

我在 google 中搜索了不同种类的关键字和标题问题,并在 stack exchange 上阅读了各种建议的主题。在关于 mathwork 许可证管理器的文档中,我发现也许我必须先启动一个 matlab 守护程序,然后才能调用 matlab。但是,我并不真正了解 matlab 发行版中的 lm 库的作用,因此我对运行它们犹豫不决。

这是我根据这个launchd 教程编写的 plist(存储在 /Library/LaunchDaemons 下)的副本:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.<app_name>.testDaemon</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/bin/python</string>
                <string>/Users/<username>/Documents/daemontest/matlab_batcher.py</string>
        </array>
        <key>StandardOutPath</key>
        <string>/Users/<username>/Documents/daemontest/test.stdout</string>
        <key>StandardErrorPath</key>
        <string>/Users/<username>/Documents/daemontest/test.stderr</string>
        <key>WorkingDirectory</key>
        <string>/Users/<username>/Documents/daemontest</string>
        <key>StartCalendarInterval</key>
        <array>
                <dict>
                        <key>Hour</key>
                        <integer>16</integer>
                        <key>Minute</key>
                        <integer>0</integer>
                </dict>
        </array>
        <key>KeepAlive</key>
        <false/>
</dict>
</plist>

只要我使用计算机,将 plist 存储在 ~/Library/LaunchAgents 下实际上就可以正常工作。我将 plist 移动到 /Library/LaunchDaemons 因为我认为这些也会在其他用户登录或计算机正在运行但没有人使用它时运行。我非常感谢您的帮助。

我实际上想在与我的工作帐户不同的用户帐户下运行守护程序,但我的试用失败了,我复制了工作目录并将文件路径更改为另一个用户帐户并将密钥用户名添加到 plist。守护进程甚至没有启动,而是返回了 78(我没有发现这个退出值可能意味着什么)。这有点偏离主题,但如果您有任何建议,我将不胜感激。

4

1 回答 1

0

终于想出了一个解决方案,好吧,而不是变通。

在 python 脚本中,我使用的是 matlab 的 MatlabEngine。显然,这仅在用户处于活动状态时才开始。我仍然不知道细节,但必须在用户变为非活动状态后几分钟内使用 matlab 许可证和 imac 切换到的模型。虽然正确理解这一点会很有趣......

实际可行的是使用 bash 命令而不是 MatlabEngine 来调用 matlab。这并不像 MatlabEngine 那样提供与 matlab 函数的直接交互,但对我来说完全足够了。

于 2015-07-31T08:17:37.423 回答