【发布时间】: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