当我在计算机上不活动时,如何使用守护进程启动 matlab?

How can I start matlab with a daemon when I'm not active on the computer?

我每天需要执行几个 matlab 函数。其中一些功能从 Internet 下载数据。例如,如果数据尚未准备好,它们就会失败,我希望它们在一段时间后重试。为了实现这一点,我有一个 python 脚本多次调用 matlab 函数直到成功,或者如果它们反复失败则向我发送 e-mail。可能不是 "state of the art" 实现,但我不知道更好。 python 脚本每天由守护进程调用。现在,如果我登录到计算机但失败并显示 return 值 1 和以下消息(守护程序错误日志),当计算机(imac)休息一段时间(我禁止它在能量中睡眠节省偏好。至少我认为我是通过勾选 "Prevent computer from sleeping automatically when the display is off" 来完成的。但是,"Enable Power Nap" 是打开的。)

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 中搜索了关键字和不同品种的 title-question 并阅读了堆栈交换上的各种建议主题。在 docu about the mathwork license manager 中,我发现也许我必须先启动一个 matlab 守护进程,然后才能调用 matlab.但是,我真的不明白 matlab 发行版中的 lm-libraries 是做什么的,我对 运行 犹豫不决。

这是我根据launchd Tutorial:

编写的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,因为我认为当另一个用户登录时或者当计算机处于 运行ning 但没有人使用它时,这些也会 运行。非常感谢你的帮助。

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

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

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

真正起作用的是使用 bash 命令而不是 MatlabEngine 来调用 matlab。这并不像 MatlabEngine 那样提供与 matlab 函数的直接交互,但对于我的情况来说完全足够了。