Как я могу запустить Matlab с демоном, когда я не активен на компьютере?
Мне нужно выполнять несколько функций Matlab ежедневно. Некоторые из этих функций загружают данные из Интернета. Они терпят неудачу, если данные еще не готовы, например, и я хочу, чтобы они попробовали снова через некоторое время. Чтобы реализовать это, у меня есть скрипт на python, вызывающий функции matlab несколько раз до успеха, или отправляю мне электронное письмо, если они повторяются неудачно. Вероятно, не "современная" реализация, но я не знаю лучше. Скрипт python вызывается каждый день демоном. Теперь, это работает, если я вошел в компьютер, но завершился неудачно с возвращаемым значением 1 и следующим сообщением (журнал ошибок демона), когда компьютер (imac) некоторое время отдыхает (я запрещаю ему спать, хотя в настройках энергосбережения). По крайней мере, я думаю, что сделал это, отметив галочкой "Запретить автоматическое отключение компьютера, когда дисплей выключен". Однако "Включить 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 и читал различные предлагаемые темы здесь на стеке обмена. В документе о диспетчере лицензий по математике я обнаружил, что, возможно, мне нужно запустить демон Matlab, прежде чем я смогу вызвать Matlab. Однако я не совсем понимаю, что делают библиотеки lm в дистрибутиве matlab, и я не решаюсь их запустить.
Это копия моего 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 (я не выяснил, что могло бы означать это значение выхода). Это немного не по теме, но я буду признателен за комментарии по этому поводу, если у вас есть предложения в любом случае.
1 ответ
Наконец-то разобрался с решением, ну скорее обходной путь.
В скрипте Python я использовал MatlabEngine от Matlab. По-видимому, это начинается только тогда, когда пользователь активен. Подробности, которые я до сих пор не знаю, но должны быть чем-то особенным с лицензией Matlab и моделью, на которую imac переключается через несколько минут после того, как пользователь становится неактивным. Хотя было бы интересно понять это правильно...
Что на самом деле работает, так это использование команд bash вместо MatlabEngine для вызова matlab. Это не предлагает прямого взаимодействия с функцией Matlab, как MatlabEngine, но для моего случая вполне достаточно.