【问题标题】:How can I start matlab with a daemon when I'm not active on the computer?当我在计算机上不活动时,如何使用守护程序启动 matlab?
【发布时间】:2015-07-30 08:07:11
【问题描述】:

我需要每天执行几个 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 上阅读了各种建议的主题。在docu about the mathwork license manager 中,我发现也许我必须启动一个matlab 守护进程才能调用matlab。但是,我并不真正了解 matlab 发行版中的 lm 库的作用,因此我对运行它们犹豫不决。

这是我基于 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 因为我认为这些也会在另一个用户登录或计算机正在运行但没有人使用它时运行。我非常感谢您的帮助。

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

【问题讨论】:

  • 两件事。首先,cron 可以为您处理这一切。用 Python 手动完成会做更多的工作。其次,如果您已经在使用 Python,为什么要开始使用 MATLAB 下载东西? MATLAB 在很多方面都很出色,但基于 Web 的东西不是其中之一。另一方面,Python 擅长基于 Web 的东西。仅仅为了进行一些下载而启动 MATLAB 会话会产生大量不必要的开销。所以你最好直接使用 Python 进行下载。
  • 感谢您的评论!
  • 你的意思是下载数据和失败时发送邮件可以由launchd作业处理(不再推荐cron)?第二个:Matlab 还对下载的数据进行了一些计算,所以无论如何我都必须使用守护进程启动 matlab。我可能迟早会将 matlab 代码迁移到 python 或 java,但现在我的工作是用更稳定的东西(如果可能的话)替换非常不可靠的 matlab 计时器。
  • 我知道你可以在 cron 中做到,我不知道 launchd。

标签: python plist daemon matlab-engine


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2017-02-27
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多