Возможный дубликат:
сценарий оболочки не запускается правильно в cron
Я хочу вызвать сценарий оболочки, который я написал из cron. В сценарии оболочки используется программа Linkchecker. Если я запускаю сценарий оболочки из терминала, он работает нормально. Однако при запуске cron я получаю следующие ошибки:
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: неизвестная кодировка: Traceback (most recent call last):
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: неизвестная кодировка: Traceback (most recent call last):
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: неизвестная кодировка: Traceback (most recent call last):
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: неизвестная кодировка: Traceback (most recent call last):
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: неизвестная кодировка: Traceback (most recent call last):
Файл "/Users/keith/etc/cron/linkchecker", строка 40, в from linkcheck.director import console, check_urls, get_aggregate
Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/init.py", строка 25, in from . import aggregator, console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py", строка 25, в from . import logger, status, checker, cleanup Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py", строка 20, in from . import task Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py", строка 20, in from . import console Файл "/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py", строка 27, in stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") Файл "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", строка 930, в getwriter return lookup(encoding).streamwriter LookupError: unknown encoding:
У меня chmod 777 для файла linkchecker. Я переместил файл linkchecker в мой текущий домашний каталог. Я добавил cron, сказав
crontab -e
Я поставил
38 12 * * 5 /Users/keith/etc/cron/linkchecker.sh
Первая строка моего сценария оболочки - #!/bin/sh
Итак, единственное, о чем я могу думать, это то, что мне не хватает некоторых переменных окружения при запуске cron. Когда я добавляю env в верхней части моего скрипта и сравниваю переменные при запуске cron и в терминале, есть разница. Согласно https://stackoverflow.com/questions/1694942/environment-variable-used-in-shell-script-appear-blank-in-log-file-when-run-by-cr я могу добавить . /etc/profile и это должно добавить правильные переменные окружения. Похоже, что это не всасывает переменные, потому что переменные остаются теми же, когда я использую env.
Я работаю на Mac, если это имеет значение. Также я вставил рабочие переменные в верхней части моего скрипта, которые работали при запуске из терминала, а cron все еще не работал.
Попробуйте это
38 12 * * 5 /bin/bash -l -c /Users/keith/etc/cron/linkchecker.sh
-l
опция получит среду входа в систему для выполнения сценария.