сценарий cron blues
-
22-09-2019 - |
Вопрос
У меня есть файл сценария, который отлично работает из командной строки, т.е.:
./escript_file
Он предназначен для использования в cron, и все пути указаны явно, но когда я запускаю его, он не может скомпилироваться, говоря, что есть bad attributes
.
Плохие атрибуты, о которых идет речь, — это определения макросов:
-define(COOKIE, 'somecookie').
Ответ
Благодаря предложению Джеффа Риди я выяснил, какая версия Erlang работает, распечатав init:script_id()
который печатает строку типа {"OPT APN 181 O1", "R13B"}
и, конечно же, версии командной строки и cron подбирали разные версии.
В скрипте была начальная строка:
#!/usr/bin/env escript
и операционная система «находила» для меня Erlang.Различные переменные среды cron означали, что был выбран другой эрланг (первый ответ Джеффа, который я вроде как знал, но не мог понять, как это повлияет на ситуацию).
Тогда решение состоит в том, чтобы принудительно использовать версию с начальной строкой:
#!/usr/local/lib/erlang/erts-5.7.3/bin/escript
Постскриптум
Была еще другая Ubuntu apt-get
установка более ранней версии Erlang (в другом месте относительно исходной установки) и ошибочная 64-битная установка...
Среда cron продолжала возвращаться к более старым и малоизвестным установкам, но все время терпела неудачу :(
Решение
Возможно, cron подбирает на пути другую версию erlang. Документация Эрланга R12B говорит, что escript игнорирует директивы препроцессора, кроме include_lib. Документация Эрланга R13B говорит, что для файла запущен препроцессор.Это определенно объяснило бы разницу в поведении.
Другие советы
Если из командной строки все работает нормально, вероятной причиной является разница в переменных среды вашей интерактивной оболочки и в том случае, когда cron запускает сценарий.